[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