mirror of
https://github.com/aap/librw.git
synced 2026-01-05 18:50:30 +00:00
implement more options for matfx
This commit is contained in:
@@ -1065,8 +1065,6 @@ setViewMatrix(float32 *mat)
|
||||
|
||||
Shader *lastShaderUploaded;
|
||||
|
||||
#define U(i) currentShader->uniformLocations[i]
|
||||
|
||||
void
|
||||
setMaterial(const RGBA &color, const SurfaceProperties &surfaceprops, float extraSurfProp)
|
||||
{
|
||||
|
||||
@@ -28,6 +28,7 @@ static Shader *envShader;
|
||||
static int32 u_texMatrix;
|
||||
static int32 u_fxparams;
|
||||
static int32 u_colorClamp;
|
||||
static int32 u_envColor;
|
||||
|
||||
void
|
||||
matfxDefaultRender(InstanceDataHeader *header, InstanceData *inst, uint32 flags)
|
||||
@@ -73,6 +74,8 @@ uploadEnvMatrix(Frame *frame)
|
||||
Matrix::invert(&invMat, frame->getLTM());
|
||||
convMatrix(&invMtx, &invMat);
|
||||
invMtx.pos.set(0.0f, 0.0f, 0.0f);
|
||||
float uscale = fabs(normal2texcoord.right.x);
|
||||
normal2texcoord.right.x = MatFX::envMapFlipU ? -uscale : uscale;
|
||||
RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord);
|
||||
}
|
||||
setUniform(u_texMatrix, &envMtx);
|
||||
@@ -106,10 +109,16 @@ matfxEnvRender(InstanceDataHeader *header, InstanceData *inst, uint32 flags, Mat
|
||||
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
|
||||
if(MatFX::modulateEnvMap)
|
||||
if(MatFX::envMapApplyLight)
|
||||
setUniform(u_colorClamp, zero);
|
||||
else
|
||||
setUniform(u_colorClamp, one);
|
||||
RGBAf envcol[4];
|
||||
if(MatFX::envMapUseMatColor)
|
||||
convColor(envcol, &m->color);
|
||||
else
|
||||
convColor(envcol, &MatFX::envMapColor);
|
||||
setUniform(u_envColor, envcol);
|
||||
|
||||
rw::SetRenderState(VERTEXALPHA, 1);
|
||||
rw::SetRenderState(SRCBLEND, BLENDONE);
|
||||
@@ -195,6 +204,7 @@ initMatFX(void)
|
||||
u_texMatrix = registerUniform("u_texMatrix", UNIFORM_MAT4);
|
||||
u_fxparams = registerUniform("u_fxparams", UNIFORM_VEC4);
|
||||
u_colorClamp = registerUniform("u_colorClamp", UNIFORM_VEC4);
|
||||
u_envColor = registerUniform("u_envColor", UNIFORM_VEC4);
|
||||
|
||||
Driver::registerPlugin(PLATFORM_GL3, 0, ID_MATFX,
|
||||
matfxOpen, matfxClose);
|
||||
|
||||
@@ -2,12 +2,12 @@ uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
|
||||
uniform vec4 u_fxparams;
|
||||
uniform vec4 u_colorClamp;
|
||||
|
||||
#define shininess (u_fxparams.x)
|
||||
#define disableFBA (u_fxparams.y)
|
||||
|
||||
FSIN vec4 v_color;
|
||||
FSIN vec4 v_envColor;
|
||||
FSIN vec2 v_tex0;
|
||||
FSIN vec2 v_tex1;
|
||||
FSIN float v_fog;
|
||||
@@ -16,10 +16,9 @@ void
|
||||
main(void)
|
||||
{
|
||||
vec4 pass1 = v_color;
|
||||
vec4 envColor = max(pass1, u_colorClamp);
|
||||
pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
|
||||
|
||||
vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
|
||||
vec4 pass2 = v_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);
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
uniform mat4 u_texMatrix;
|
||||
uniform vec4 u_colorClamp;
|
||||
uniform vec4 u_envColor;
|
||||
|
||||
VSIN(ATTRIB_POS) vec3 in_pos;
|
||||
|
||||
VSOUT vec4 v_color;
|
||||
VSOUT vec4 v_envColor;
|
||||
VSOUT vec2 v_tex0;
|
||||
VSOUT vec2 v_tex1;
|
||||
VSOUT float v_fog;
|
||||
@@ -21,6 +24,7 @@ main(void)
|
||||
v_color.rgb += u_ambLight.rgb*surfAmbient;
|
||||
v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;
|
||||
v_color = clamp(v_color, 0.0, 1.0);
|
||||
v_envColor = max(v_color, u_colorClamp) * u_envColor;
|
||||
v_color *= u_matColor;
|
||||
|
||||
v_fog = DoFog(gl_Position.w);
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
const char *matfx_env_vert_src =
|
||||
"uniform mat4 u_texMatrix;\n"
|
||||
"uniform vec4 u_colorClamp;\n"
|
||||
"uniform vec4 u_envColor;\n"
|
||||
|
||||
"VSIN(ATTRIB_POS) vec3 in_pos;\n"
|
||||
|
||||
"VSOUT vec4 v_color;\n"
|
||||
"VSOUT vec4 v_envColor;\n"
|
||||
"VSOUT vec2 v_tex0;\n"
|
||||
"VSOUT vec2 v_tex1;\n"
|
||||
"VSOUT float v_fog;\n"
|
||||
@@ -22,6 +25,7 @@ const char *matfx_env_vert_src =
|
||||
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
|
||||
" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n"
|
||||
" v_color = clamp(v_color, 0.0, 1.0);\n"
|
||||
" v_envColor = max(v_color, u_colorClamp) * u_envColor;\n"
|
||||
" v_color *= u_matColor;\n"
|
||||
|
||||
" v_fog = DoFog(gl_Position.w);\n"
|
||||
@@ -32,12 +36,12 @@ const char *matfx_env_frag_src =
|
||||
"uniform sampler2D tex1;\n"
|
||||
|
||||
"uniform vec4 u_fxparams;\n"
|
||||
"uniform vec4 u_colorClamp;\n"
|
||||
|
||||
"#define shininess (u_fxparams.x)\n"
|
||||
"#define disableFBA (u_fxparams.y)\n"
|
||||
|
||||
"FSIN vec4 v_color;\n"
|
||||
"FSIN vec4 v_envColor;\n"
|
||||
"FSIN vec2 v_tex0;\n"
|
||||
"FSIN vec2 v_tex1;\n"
|
||||
"FSIN float v_fog;\n"
|
||||
@@ -46,10 +50,9 @@ const char *matfx_env_frag_src =
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" vec4 pass1 = v_color;\n"
|
||||
" vec4 envColor = max(pass1, u_colorClamp);\n"
|
||||
" pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
|
||||
|
||||
" vec4 pass2 = envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
|
||||
" vec4 pass2 = v_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"
|
||||
|
||||
Reference in New Issue
Block a user