[Scummvm-git-logs] scummvm master -> 2c22ce882b10c374593f99598dd130e39acb4066

aquadran noreply at scummvm.org
Sat May 24 10:15:25 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
2c22ce882b WINTERMUTE: Implemented post filters for shader renderer


Commit: 2c22ce882b10c374593f99598dd130e39acb4066
    https://github.com/scummvm/scummvm/commit/2c22ce882b10c374593f99598dd130e39acb4066
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-05-24T12:15:20+02:00

Commit Message:
WINTERMUTE: Implemented post filters for shader renderer

Changed paths:
  A engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment
  A engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex
    devtools/create_project/xcode.cpp
    dists/scummvm.rc
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h


diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp
index 4e369f1f253..386b19e4266 100644
--- a/devtools/create_project/xcode.cpp
+++ b/devtools/create_project/xcode.cpp
@@ -1151,6 +1151,8 @@ XcodeProvider::ValueList& XcodeProvider::getResourceFiles(const BuildSetup &setu
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_line.vertex");
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment");
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex");
+			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment");
+			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex");
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_shadow_mask.fragment");
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_shadow_mask.vertex");
 			files.push_back("engines/wintermute/base/gfx/opengl/shaders/wme_shadow_volume.fragment");
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index d9e4f203642..465f8550a4c 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -110,6 +110,8 @@ shaders/wme_line.fragment               FILE    "engines/wintermute/base/gfx/ope
 shaders/wme_line.vertex                 FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_line.vertex"
 shaders/wme_modelx.fragment             FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment"
 shaders/wme_modelx.vertex               FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex"
+shaders/wme_postfilter.fragment         FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment"
+shaders/wme_postfilter.vertex           FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex"
 shaders/wme_shadow_mask.fragment        FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_shadow_mask.fragment"
 shaders/wme_shadow_mask.vertex          FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_shadow_mask.vertex"
 shaders/wme_shadow_volume.fragment      FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_shadow_volume.fragment"
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index 7b106705813..048e4662cc5 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -99,8 +99,8 @@ bool BaseRenderOpenGL3D::initRenderer(int width, int height, bool windowed) {
 	_simpleShadow[3].v = 0.0f;
 
 	// filter post process: greyscale, sepia
-	glGenTextures(1, &_filterTexture);
-	glBindTexture(GL_TEXTURE_2D, _filterTexture);
+	glGenTextures(1, &_postfilterTexture);
+	glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
@@ -1007,7 +1007,7 @@ void BaseRenderOpenGL3D::postfilter() {
 
 
 		glEnable(GL_TEXTURE_2D);
-		glBindTexture(GL_TEXTURE_2D, _filterTexture);
+		glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
 
 
 		glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index 7100c8dfead..c687ee6005e 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -166,7 +166,7 @@ private:
 	SimpleShadowVertex _simpleShadow[4];
 	Common::Array<DXVector4> _lightPositions;
 	Common::Array<DXVector3> _lightDirections;
-	GLuint _filterTexture;
+	GLuint _postfilterTexture;
 };
 
 } // wintermute namespace
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
index 371190e05ef..81c57354e73 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -61,6 +61,7 @@ BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
 	glDeleteBuffers(1, &_fadeVBO);
 	glDeleteBuffers(1, &_lineVBO);
 	glDeleteBuffers(1, &_simpleShadowVBO);
+	glDeleteBuffers(1, &_postfilterVBO);
 }
 
 bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed) {
@@ -166,6 +167,27 @@ bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed
 	_lineShader = OpenGL::Shader::fromFiles("wme_line", lineAttributes);
 	_lineShader->enableVertexAttribute("position", _lineVBO, 3, GL_FLOAT, false, sizeof(LineVertex), 0);
 
+	const GLfloat quadVertices[] = {
+		-1.0f, -1.0f, 0.0f, 0.0f,
+		 1.0f, -1.0f, 1.0f, 0.0f,
+		-1.0f,  1.0f, 0.0f, 1.0f,
+		 1.0f,  1.0f, 1.0f, 1.0f,
+	};
+	glGenBuffers(1, &_postfilterVBO);
+	glBindBuffer(GL_ARRAY_BUFFER, _postfilterVBO);
+	glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(GLfloat), quadVertices, GL_STATIC_DRAW);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+	static const char *postfilterAttributes[] = { "position", "texcoord", nullptr };
+	_postfilterShader = OpenGL::Shader::fromFiles("wme_postfilter", postfilterAttributes);
+	_postfilterShader->enableVertexAttribute("position", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 0);
+	_postfilterShader->enableVertexAttribute("texcoord", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 8);
+
+	glGenTextures(1, &_postfilterTexture);
+	glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
 
 
 	_windowed = !ConfMan.getBool("fullscreen");
@@ -183,6 +205,7 @@ bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed
 
 bool BaseRenderOpenGL3DShader::flip() {
 	_lastTexture = nullptr;
+	postfilter();
 
 	// Disable blend mode and cull face to prevent interfere with backend renderer
 	glDisable(GL_BLEND);
@@ -1067,6 +1090,33 @@ bool BaseRenderOpenGL3DShader::setProjectionTransform(const DXMatrix &transform)
 }
 
 void BaseRenderOpenGL3DShader::postfilter() {
+	if (_postFilterMode == kPostFilterOff)
+		return;
+
+	setup2D();
+	glViewport(0, 0, _width, _height);
+
+	if (_postFilterMode == kPostFilterBlackAndWhite ||
+		_postFilterMode == kPostFilterSepia) {
+		glDisable(GL_BLEND);
+		glDisable(GL_CULL_FACE);
+
+		_postfilterShader->use();
+
+		glActiveTexture(GL_TEXTURE0);
+		glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+		glUniform1i(_postfilterShader->getUniformLocation("tex"), 0);
+
+		if (_postFilterMode == kPostFilterSepia) {
+			_postfilterShader->setUniform1f("sepiaMode", true);
+		} else {
+			_postfilterShader->setUniform1f("sepiaMode", false);
+		}
+
+		glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
+
+		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	}
 }
 
 BaseSurface *BaseRenderOpenGL3DShader::createSurface() {
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
index d55f127d4fb..642e0aeadc1 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -179,6 +179,7 @@ private:
 	GLuint _fadeVBO{};
 	GLuint _lineVBO{};
 	GLuint _simpleShadowVBO{};
+	GLuint _postfilterVBO{};
 	OpenGL::Shader *_spriteShader{};
 	OpenGL::Shader *_fadeShader{};
 	OpenGL::Shader *_xmodelShader{};
@@ -187,6 +188,8 @@ private:
 	OpenGL::Shader *_flatShadowShader{};
 	OpenGL::Shader *_shadowVolumeShader{};
 	OpenGL::Shader *_lineShader{};
+	OpenGL::Shader *_postfilterShader{};
+	GLuint _postfilterTexture;
 };
 
 } // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment
new file mode 100644
index 00000000000..0bf4ddfe6bd
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.fragment
@@ -0,0 +1,21 @@
+varying vec2 texPos;
+
+uniform sampler2D tex;
+uniform UBOOL sepiaMode;
+
+OUTPUT
+
+void main() {
+	vec4 color = texture2D(tex, texPos);
+	if (sepiaMode) {
+		float r = color.r;
+		float g = color.g;
+		float b = color.b;
+		outColor.r = dot(vec3(r, g, b), vec3(0.393, 0.769, 0.189));
+		outColor.g = dot(vec3(r, g, b), vec3(0.349, 0.686, 0.168));
+		outColor.b = dot(vec3(r, g, b), vec3(0.272, 0.534, 0.131));
+	} else {
+		float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
+		outColor = vec4(vec3(gray), 1.0f);
+	}
+}
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex
new file mode 100644
index 00000000000..0ab72b31e36
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_postfilter.vertex
@@ -0,0 +1,9 @@
+in vec2 position;
+in vec2 texcoord;
+
+varying vec2 texPos;
+
+void main() {
+	gl_Position = vec4(position, 0.0, 1.0);
+	texPos = texcoord;
+}




More information about the Scummvm-git-logs mailing list