[Scummvm-git-logs] scummvm master -> f8a93cecd4250d6b2f28f41016e71827b475e36b
aquadran
noreply at scummvm.org
Mon Nov 4 15:46:56 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f8a93cecd4 WINTERMUTE: Fixed alpha testing handling in shader renderer
Commit: f8a93cecd4250d6b2f28f41016e71827b475e36b
https://github.com/scummvm/scummvm/commit/f8a93cecd4250d6b2f28f41016e71827b475e36b
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-11-04T16:46:50+01:00
Commit Message:
WINTERMUTE: Fixed alpha testing handling in shader renderer
Changed paths:
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment
engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
engines/wintermute/base/gfx/opengl/shaders/wme_sprite.fragment
engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h
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 98878ee161a..5c33c013031 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -50,6 +50,7 @@ BaseRenderer3D *makeOpenGL3DShaderRenderer(BaseGame *inGame) {
BaseRenderOpenGL3DShader::BaseRenderOpenGL3DShader(BaseGame *inGame) : BaseRenderer3D(inGame) {
setDefaultAmbientLightColor();
_spriteVBO = 0;
+ _alphaRef = 0;
}
BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
@@ -169,8 +170,7 @@ bool BaseRenderOpenGL3DShader::setup2D(bool force) {
glEnable(GL_BLEND);
setSpriteBlendMode(Graphics::BLEND_NORMAL);
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GEQUAL, 0.0f);
+ _alphaRef = 0.0f;
glPolygonMode(GL_FRONT, GL_FILL);
glFrontFace(GL_CCW); // WME DX have CW
@@ -191,10 +191,8 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glEnable(GL_DEPTH_TEST);
- //glEnable(GL_ALPHA_TEST);
- // WME uses 8 as a reference value and Direct3D expects it to be in the range [0, 255]
- // 8 / 255 ~ 0.0313
- //glAlphaFunc(GL_GEQUAL, 0.0313f);
+ // this is 8 / 255, since 8 is the value used by WME DX
+ _alphaRef = 8 / 255.f;
setAmbientLightRenderState();
@@ -252,6 +250,9 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
_xmodelShader->use();
_xmodelShader->setUniform("viewMatrix", viewMatrix);
_xmodelShader->setUniform("projMatrix", projectionMatrix);
+ _xmodelShader->setUniform1f("alphaRef", _alphaRef);
+ _xmodelShader->setUniform("alphaTest", true);
+
_geometryShader->use();
_geometryShader->setUniform("viewMatrix", viewMatrix);
@@ -305,7 +306,9 @@ bool BaseRenderOpenGL3DShader::setupLines() {
glFrontFace(GL_CW); // WME DX have CCW
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
- glEnable(GL_ALPHA_TEST);
+ _lineShader->use();
+ _lineShader->setUniform1f("alphaRef", _alphaRef);
+ _lineShader->setUniform("alphaTest", true);
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
@@ -419,7 +422,7 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
} else {
setSpriteBlendMode(blendMode);
if (alphaDisable) {
- glDisable(GL_ALPHA_TEST);
+ _spriteShader->setUniform("alphaTest", false);
glDisable(GL_BLEND);
}
@@ -442,7 +445,7 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
if (alphaDisable) {
- glEnable(GL_ALPHA_TEST);
+ _spriteShader->setUniform("alphaTest", true);
glEnable(GL_BLEND);
}
}
@@ -454,7 +457,7 @@ bool BaseRenderOpenGL3DShader::commitSpriteBatch() {
// render
setSpriteBlendMode(_batchBlendMode);
if (_batchAlphaDisable) {
- glDisable(GL_ALPHA_TEST);
+ _spriteShader->setUniform("alphaTest", false);
glDisable(GL_BLEND);
}
@@ -466,7 +469,7 @@ bool BaseRenderOpenGL3DShader::commitSpriteBatch() {
// TODO
if (_batchAlphaDisable) {
- glEnable(GL_ALPHA_TEST);
+ _spriteShader->setUniform("alphaTest", true);
glEnable(GL_BLEND);
}
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 649a76d9d3b..c9cfde0c0ce 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -139,6 +139,7 @@ public:
private:
DXMatrix _glProjectionMatrix;
+ float _alphaRef;
Common::Array<DXMatrix> _transformStack;
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment
index 150bb686a21..af25a55b224 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment
@@ -1,7 +1,14 @@
in vec4 Color;
+uniform float alphaRef;
+uniform UBOOL alphaTest;
+
OUTPUT
void main() {
outColor = Color;
+
+ if (UBOOL_TEST(alphaTest) && outColor.a < alphaRef) {
+ discard;
+ }
}
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
index a0de4c3ed4e..7f6231e4d18 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
@@ -3,6 +3,7 @@ in vec4 Color;
uniform sampler2D tex;
uniform float alphaRef;
+uniform UBOOL alphaTest;
OUTPUT
@@ -10,7 +11,7 @@ void main() {
vec4 texColor = texture(tex, Texcoord);
outColor.rgba = texColor.rgba * Color.rgba;
- if (outColor.a < alphaRef) {
+ if (UBOOL_TEST(alphaTest) && outColor.a < alphaRef) {
discard;
}
}
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.fragment
index 49ce91335d4..5f602beebab 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.fragment
@@ -2,10 +2,16 @@ in vec2 Texcoord;
in vec4 Color;
uniform sampler2D tex;
+uniform float alphaRef;
+uniform UBOOL alphaTest;
OUTPUT
void main() {
vec4 texColor = texture(tex, Texcoord);
outColor = Color * texColor;
+
+ if (UBOOL_TEST(alphaTest) && outColor.a < alphaRef) {
+ discard;
+ }
}
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
index fd832d7f59e..d22b42266a7 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
@@ -44,7 +44,7 @@ struct ShadowVertexShader {
//////////////////////////////////////////////////////////////////////////
ShadowVolumeOpenGLShader::ShadowVolumeOpenGLShader(BaseGame *inGame, OpenGL::Shader *volumeShader, OpenGL::Shader *maskShader)
- : ShadowVolume(inGame), _color(0x7f000000), _volumeShader(volumeShader), _maskShader(maskShader) {
+ : ShadowVolume(inGame), _volumeShader(volumeShader), _maskShader(maskShader) {
ShadowVertexShader shadowMask[4];
_shadowVolumeVertexBuffer = 0;
DXViewport viewport = _gameRef->_renderer3D->getViewPort();
@@ -146,7 +146,6 @@ bool ShadowVolumeOpenGLShader::renderToScene() {
glStencilFunc(GL_LEQUAL, 0x1, 0xFFFFFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glDisable(GL_ALPHA_TEST);
glBindTexture(GL_TEXTURE_2D, 0);
BaseRenderOpenGL3DShader *renderer = dynamic_cast<BaseRenderOpenGL3DShader *>(_gameRef->_renderer3D);
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h
index 90a0beb4f21..e5fb62b78a3 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h
@@ -48,7 +48,6 @@ public:
private:
bool render();
- uint32 _color;
bool initMask() override;
GLuint _shadowVolumeVertexBuffer;
GLuint _shadowMaskVertexBuffer;
More information about the Scummvm-git-logs
mailing list