Browse Source

Clear exposure compensation state textures on creation (#13151)

x2048 1 year ago
parent
commit
6f5703baf1
3 changed files with 22 additions and 9 deletions
  1. 17 5
      src/client/render/pipeline.cpp
  2. 3 2
      src/client/render/pipeline.h
  3. 2 2
      src/client/render/secondstage.cpp

+ 17 - 5
src/client/render/pipeline.cpp

@@ -40,7 +40,7 @@ video::ITexture *TextureBuffer::getTexture(u8 index)
 }
 
 
-void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format)
+void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format, bool clear)
 {
 	assert(index != NO_DEPTH_TEXTURE);
 
@@ -54,9 +54,10 @@ void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::str
 	definition.size = size;
 	definition.name = name;
 	definition.format = format;
+	definition.clear = clear;
 }
 
-void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format)
+void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format, bool clear)
 {
 	assert(index != NO_DEPTH_TEXTURE);
 
@@ -70,6 +71,7 @@ void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &na
 	definition.scale_factor = scale_factor;
 	definition.name = name;
 	definition.format = format;
+	definition.clear = clear;
 }
 
 void TextureBuffer::reset(PipelineContext &context)
@@ -135,10 +137,20 @@ bool TextureBuffer::ensureTexture(video::ITexture **texture, const TextureDefini
 	if (*texture)
 		m_driver->removeTexture(*texture);
 
-	if (definition.valid)
-		*texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format);
-	else
+	if (definition.valid) {
+		if (definition.clear) {
+			video::IImage *image = m_driver->createImage(definition.format, size);
+			image->fill(0u);
+			*texture = m_driver->addTexture(definition.name.c_str(), image);
+			image->drop();
+		}
+		else {
+			*texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format);
+		}
+	}
+	else {
 		*texture = nullptr;
+	}
 
 	return true;
 }

+ 3 - 2
src/client/render/pipeline.h

@@ -126,7 +126,7 @@ public:
 	 * @param name unique name of the texture
 	 * @param format color format
 	 */
-	void setTexture(u8 index, core::dimension2du size, const std::string& name, video::ECOLOR_FORMAT format);
+	void setTexture(u8 index, core::dimension2du size, const std::string& name, video::ECOLOR_FORMAT format, bool clear = false);
 
 	/**
 	 * Configure relative-size texture for the specific index
@@ -136,7 +136,7 @@ public:
 	 * @param name unique name of the texture
 	 * @param format color format
 	 */
-	void setTexture(u8 index, v2f scale_factor, const std::string& name, video::ECOLOR_FORMAT format);
+	void setTexture(u8 index, v2f scale_factor, const std::string& name, video::ECOLOR_FORMAT format, bool clear = false);
 
 	virtual u8 getTextureCount() override { return m_textures.size(); }
 	virtual video::ITexture *getTexture(u8 index) override;
@@ -150,6 +150,7 @@ private:
 		bool valid { false };
 		bool fixed_size { false };
 		bool dirty { false };
+		bool clear { false };
 		v2f scale_factor;
 		core::dimension2du size;
 		std::string name;

+ 2 - 2
src/client/render/secondstage.cpp

@@ -121,8 +121,8 @@ RenderStep *addPostProcessing(RenderPipeline *pipeline, RenderStep *previousStep
 	static const u8 TEXTURE_BLOOM_UP = 20;
 
 	buffer->setTexture(TEXTURE_COLOR, scale, "3d_render", color_format);
-	buffer->setTexture(TEXTURE_EXPOSURE_1, core::dimension2du(1,1), "exposure_1", color_format);
-	buffer->setTexture(TEXTURE_EXPOSURE_2, core::dimension2du(1,1), "exposure_2", color_format);
+	buffer->setTexture(TEXTURE_EXPOSURE_1, core::dimension2du(1,1), "exposure_1", color_format, /*clear:*/ true);
+	buffer->setTexture(TEXTURE_EXPOSURE_2, core::dimension2du(1,1), "exposure_2", color_format, /*clear:*/ true);
 	buffer->setTexture(TEXTURE_DEPTH, scale, "3d_depthmap", depth_format);
 
 	// attach buffer to the previous step