소스 검색

Optimize data format for OpenSimplex images

The previous RGBA format included unused RGB data. Using the LA8 format
removes the need to store the extra data.

The Docs have been updated to reflect the format changes.

(cherry picked from commit 041fe20f64ef7aea0586183fa72462370a54e470)
nevarek 4 년 전
부모
커밋
2167b977de
3개의 변경된 파일9개의 추가작업 그리고 17개의 파일을 삭제
  1. 2 2
      modules/opensimplex/doc_classes/OpenSimplexNoise.xml
  2. 1 1
      modules/opensimplex/noise_texture.cpp
  3. 6 14
      modules/opensimplex/open_simplex_noise.cpp

+ 2 - 2
modules/opensimplex/doc_classes/OpenSimplexNoise.xml

@@ -32,7 +32,7 @@
 			<argument index="1" name="height" type="int">
 			</argument>
 			<description>
-				Generate a noise image with the requested [code]width[/code] and [code]height[/code], based on the current noise parameters.
+				Generate a noise image in [constant Image.FORMAT_L8] format with the requested [code]width[/code] and [code]height[/code], based on the current noise parameters.
 			</description>
 		</method>
 		<method name="get_noise_1d" qualifiers="const">
@@ -108,7 +108,7 @@
 			<argument index="0" name="size" type="int">
 			</argument>
 			<description>
-				Generate a tileable noise image, based on the current noise parameters. Generated seamless images are always square ([code]size[/code] × [code]size[/code]).
+				Generate a tileable noise image in [constant Image.FORMAT_L8] format, based on the current noise parameters. Generated seamless images are always square ([code]size[/code] × [code]size[/code]).
 			</description>
 		</method>
 	</methods>

+ 1 - 1
modules/opensimplex/noise_texture.cpp

@@ -101,7 +101,7 @@ void NoiseTexture::_validate_property(PropertyInfo &property) const {
 void NoiseTexture::_set_texture_data(const Ref<Image> &p_image) {
 	data = p_image;
 	if (data.is_valid()) {
-		VS::get_singleton()->texture_allocate(texture, size.x, size.y, 0, Image::FORMAT_RGBA8, VS::TEXTURE_TYPE_2D, flags);
+		VS::get_singleton()->texture_allocate(texture, size.x, size.y, 0, p_image->get_format(), VS::TEXTURE_TYPE_2D, flags);
 		VS::get_singleton()->texture_set_data(texture, p_image);
 	}
 	emit_changed();

+ 6 - 14
modules/opensimplex/open_simplex_noise.cpp

@@ -99,7 +99,7 @@ void OpenSimplexNoise::set_lacunarity(float p_lacunarity) {
 Ref<Image> OpenSimplexNoise::get_image(int p_width, int p_height) const {
 
 	PoolVector<uint8_t> data;
-	data.resize(p_width * p_height * 4);
+	data.resize(p_width * p_height);
 
 	PoolVector<uint8_t>::Write wd8 = data.write();
 
@@ -107,22 +107,18 @@ Ref<Image> OpenSimplexNoise::get_image(int p_width, int p_height) const {
 		for (int j = 0; j < p_width; j++) {
 			float v = get_noise_2d(i, j);
 			v = v * 0.5 + 0.5; // Normalize [0..1]
-			uint8_t value = uint8_t(CLAMP(v * 255.0, 0, 255));
-			wd8[(i * p_width + j) * 4 + 0] = value;
-			wd8[(i * p_width + j) * 4 + 1] = value;
-			wd8[(i * p_width + j) * 4 + 2] = value;
-			wd8[(i * p_width + j) * 4 + 3] = 255;
+			wd8[(i * p_width + j)] = uint8_t(CLAMP(v * 255.0, 0, 255));
 		}
 	}
 
-	Ref<Image> image = memnew(Image(p_width, p_height, false, Image::FORMAT_RGBA8, data));
+	Ref<Image> image = memnew(Image(p_width, p_height, false, Image::FORMAT_L8, data));
 	return image;
 }
 
 Ref<Image> OpenSimplexNoise::get_seamless_image(int p_size) const {
 
 	PoolVector<uint8_t> data;
-	data.resize(p_size * p_size * 4);
+	data.resize(p_size * p_size);
 
 	PoolVector<uint8_t>::Write wd8 = data.write();
 
@@ -144,15 +140,11 @@ Ref<Image> OpenSimplexNoise::get_seamless_image(int p_size) const {
 			float v = get_noise_4d(x, y, z, w);
 
 			v = v * 0.5 + 0.5; // Normalize [0..1]
-			uint8_t value = uint8_t(CLAMP(v * 255.0, 0, 255));
-			wd8[(i * p_size + j) * 4 + 0] = value;
-			wd8[(i * p_size + j) * 4 + 1] = value;
-			wd8[(i * p_size + j) * 4 + 2] = value;
-			wd8[(i * p_size + j) * 4 + 3] = 255;
+			wd8[(i * p_size + j)] = uint8_t(CLAMP(v * 255.0, 0, 255));
 		}
 	}
 
-	Ref<Image> image = memnew(Image(p_size, p_size, false, Image::FORMAT_RGBA8, data));
+	Ref<Image> image = memnew(Image(p_size, p_size, false, Image::FORMAT_L8, data));
 	return image;
 }