fb alpha emulation for matfx

This commit is contained in:
aap
2020-05-27 10:26:28 +02:00
parent 84c582c1d7
commit 2b797aeca1
9 changed files with 154 additions and 114 deletions

View File

@@ -1,9 +1,12 @@
uniform sampler2D tex0;
uniform sampler2D tex1;
uniform float u_coefficient;
uniform vec2 u_fxparams;
uniform vec4 u_colorClamp;
#define shininess (u_fxparams.x)
#define disableFBA (u_fxparams.y)
varying vec4 v_color;
varying vec2 v_tex0;
varying vec2 v_tex1;
@@ -15,7 +18,7 @@ main(void)
vec4 color;
vec4 pass1 = v_color;
vec4 envColor = pass1; // TODO: colorClamp
vec4 envColor = max(pass1, u_colorClamp);
pass1 *= texture2D(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
vec4 pass2 = envColor*u_coefficient*texture2D(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
@@ -23,7 +26,8 @@ main(void)
pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);
pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);
color.rgb = pass1.rgb*pass1.a + pass2.rgb;
float fba = max(pass1.a, disableFBA);
color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba;
color.a = pass1.a;
DoAlphaTest(color.a);

View File

@@ -34,9 +34,12 @@ const char *matfx_env_frag_src =
"uniform sampler2D tex0;\n"
"uniform sampler2D tex1;\n"
"uniform float u_coefficient;\n"
"uniform vec2 u_fxparams;\n"
"uniform vec4 u_colorClamp;\n"
"#define shininess (u_fxparams.x)\n"
"#define disableFBA (u_fxparams.y)\n"
"varying vec4 v_color;\n"
"varying vec2 v_tex0;\n"
"varying vec2 v_tex1;\n"
@@ -48,7 +51,7 @@ const char *matfx_env_frag_src =
" vec4 color;\n"
" vec4 pass1 = v_color;\n"
" vec4 envColor = pass1; // TODO: colorClamp\n"
" vec4 envColor = max(pass1, u_colorClamp);\n"
" pass1 *= texture2D(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec4 pass2 = envColor*u_coefficient*texture2D(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
@@ -56,7 +59,8 @@ const char *matfx_env_frag_src =
" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n"
" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);\n"
" color.rgb = pass1.rgb*pass1.a + pass2.rgb;\n"
" float fba = max(pass1.a, disableFBA);\n"
" color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba;\n"
" color.a = pass1.a;\n"
" DoAlphaTest(color.a);\n"

View File

@@ -30,14 +30,14 @@ namespace gl3 {
static Shader *envShader;
static int32 u_texMatrix;
static int32 u_coefficient;
static int32 u_fxparams;
static int32 u_colorClamp;
static void*
matfxOpen(void *o, int32, int32)
{
u_texMatrix = registerUniform("u_texMatrix");
u_coefficient = registerUniform("u_coefficient");
u_fxparams = registerUniform("u_fxparams");
u_colorClamp = registerUniform("u_colorClamp");
matFXGlobals.pipelines[PLATFORM_GL3] = makeMatFXPipeline();
@@ -152,7 +152,11 @@ matfxEnvRender(InstanceDataHeader *header, InstanceData *inst, MatFX::Env *env)
surfProps[3] = 0.0f;
glUniform4fv(U(u_surfProps), 1, surfProps);
glUniform1fv(U(u_coefficient), 1, &env->coefficient);
float fxparams[2];
fxparams[0] = env->coefficient;
fxparams[1] = env->fbAlpha ? 0.0f : 1.0f;
glUniform2fv(U(u_fxparams), 1, fxparams);
static float zero[4];
static float one[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
// This clamps the vertex color below. With it we can achieve both PC and PS2 style matfx

View File

@@ -1,9 +1,12 @@
uniform sampler2D tex0;
uniform sampler2D tex1;
uniform float u_coefficient;
uniform vec2 u_fxparams;
uniform vec4 u_colorClamp;
#define shininess (u_fxparams.x)
#define disableFBA (u_fxparams.y)
in vec4 v_color;
in vec2 v_tex0;
in vec2 v_tex1;
@@ -15,15 +18,16 @@ void
main(void)
{
vec4 pass1 = v_color;
vec4 envColor = pass1; // TODO: colorClamp
vec4 envColor = max(pass1, u_colorClamp);
pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
vec4 pass2 = envColor*u_coefficient*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);
pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);
color.rgb = pass1.rgb*pass1.a + pass2.rgb;
float fba = max(pass1.a, disableFBA);
color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba;
color.a = pass1.a;
DoAlphaTest(color.a);

View File

@@ -34,9 +34,12 @@ const char *matfx_env_frag_src =
"uniform sampler2D tex0;\n"
"uniform sampler2D tex1;\n"
"uniform float u_coefficient;\n"
"uniform vec2 u_fxparams;\n"
"uniform vec4 u_colorClamp;\n"
"#define shininess (u_fxparams.x)\n"
"#define disableFBA (u_fxparams.y)\n"
"in vec4 v_color;\n"
"in vec2 v_tex0;\n"
"in vec2 v_tex1;\n"
@@ -48,15 +51,16 @@ const char *matfx_env_frag_src =
"main(void)\n"
"{\n"
" vec4 pass1 = v_color;\n"
" vec4 envColor = pass1; // TODO: colorClamp\n"
" vec4 envColor = max(pass1, u_colorClamp);\n"
" pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
" vec4 pass2 = envColor*u_coefficient*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
" vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n"
" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);\n"
" color.rgb = pass1.rgb*pass1.a + pass2.rgb;\n"
" float fba = max(pass1.a, disableFBA);\n"
" color.rgb = pass1.rgb*pass1.a + pass2.rgb*fba;\n"
" color.a = pass1.a;\n"
" DoAlphaTest(color.a);\n"