mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-21 14:41:39 +00:00
Tighten up the lighting shader code a bit, hopefully eliminating a branch or two.
This commit is contained in:
parent
1c8e456c97
commit
965007d65b
@ -1040,43 +1040,39 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||
}
|
||||
p.F(" toLight = u_lightpos%s;\n", iStr);
|
||||
p.C(" if (type != 0x0u) {\n"); // GE_LIGHTTYPE_DIRECTIONAL
|
||||
p.F(" toLight -= worldpos;\n", iStr);
|
||||
p.F(" toLight -= worldpos;\n");
|
||||
p.F(" distance = length(toLight);\n");
|
||||
p.F(" toLight /= distance;\n");
|
||||
p.F(" attenuation = clamp(1.0 / dot(u_lightatt%s, vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", iStr);
|
||||
p.C(" if (type == 0x01u) {\n"); // GE_LIGHTTYPE_POINT
|
||||
p.C(" lightScale = attenuation;\n");
|
||||
p.C(" } else {\n"); // type must be 0x02 - GE_LIGHTTYPE_SPOT
|
||||
p.F(" angle = dot(u_lightdir%s, toLight);\n", iStr);
|
||||
p.F(" if (angle >= u_lightangle_spotCoef%s.x) {\n", iStr);
|
||||
p.F(" lightScale = attenuation * (u_lightangle_spotCoef%s.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%s.y));\n", iStr, iStr, iStr);
|
||||
p.C(" } else {\n");
|
||||
p.C(" lightScale = 0.0;\n");
|
||||
p.C(" }\n");
|
||||
p.C(" }\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" lightScale = 1.0;\n"); // GE_LIGHTTYPE_DIRECTIONAL
|
||||
p.C(" }\n");
|
||||
p.C(" ldot = dot(toLight, worldnormal);\n");
|
||||
p.C(" if (comp == 0x2u) {\n"); // GE_LIGHTCOMP_ONLYPOWDIFFUSE
|
||||
p.C(" if (u_matspecular.a <= 0.0) {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" if (u_matspecular.a > 0.0) {\n");
|
||||
p.C(" ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
p.C(" }\n");
|
||||
p.C(" }\n");
|
||||
p.C(" switch (int(type)) {\n"); // Attenuation
|
||||
p.C(" case 1:\n"); // GE_LIGHTTYPE_POINT
|
||||
p.C(" lightScale = attenuation;\n");
|
||||
p.C(" break;\n");
|
||||
p.C(" case 2:\n"); // GE_LIGHTTYPE_SPOT
|
||||
p.F(" angle = dot(u_lightdir%s, toLight);\n", iStr);
|
||||
p.F(" if (angle >= u_lightangle_spotCoef%s.x) {\n", iStr);
|
||||
p.F(" lightScale = attenuation * (u_lightangle_spotCoef%s.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%s.y));\n", iStr, iStr, iStr);
|
||||
p.C(" } else {\n");
|
||||
p.C(" lightScale = 0.0;\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" }\n");
|
||||
p.C(" break;\n");
|
||||
p.C(" default:\n"); // GE_LIGHTTYPE_DIRECTIONAL
|
||||
p.C(" lightScale = 1.0;\n");
|
||||
p.C(" break;\n");
|
||||
p.C(" }\n");
|
||||
p.F(" diffuse = (u_lightdiffuse%s * diffuseColor) * max(ldot, 0.0);\n", iStr);
|
||||
p.C(" if (comp == 0x1u) {\n"); // do specular
|
||||
p.C(" if (ldot >= 0.0) {\n");
|
||||
p.C(" ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n");
|
||||
p.C(" if (u_matspecular.a <= 0.0) {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" if (u_matspecular.a > 0.0) {\n");
|
||||
p.C(" ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" }\n");
|
||||
p.C(" if (ldot > 0.0)\n");
|
||||
p.F(" lightSum1 += u_lightspecular%s * specularColor * ldot * lightScale;\n", iStr);
|
||||
@ -1115,10 +1111,10 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||
if (poweredDiffuse) {
|
||||
// pow(0.0, 0.0) may be undefined, but the PSP seems to treat it as 1.0.
|
||||
// Seen in Tales of the World: Radiant Mythology (#2424.)
|
||||
p.C(" if (u_matspecular.a <= 0.0) {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" if (u_matspecular.a > 0.0) {\n");
|
||||
p.C(" ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" }\n");
|
||||
}
|
||||
|
||||
@ -1150,10 +1146,10 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||
if (doSpecular) {
|
||||
p.C(" if (ldot >= 0.0) {\n");
|
||||
p.C(" ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n");
|
||||
p.C(" if (u_matspecular.a <= 0.0) {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" if (u_matspecular.a > 0.0) {\n");
|
||||
p.C(" ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
p.C(" } else {\n");
|
||||
p.C(" ldot = 1.0;\n");
|
||||
p.C(" }\n");
|
||||
p.C(" if (ldot > 0.0)\n");
|
||||
p.F(" lightSum1 += u_lightspecular%s * specularColor * ldot %s;\n", iStr, timesLightScale);
|
||||
|
Loading…
x
Reference in New Issue
Block a user