[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