Merge pull request #6942 from unknownbrackets/gpu-minor

gles: Avoid pow(<= 0, 0) entirely, undefined
This commit is contained in:
Henrik Rydgård 2014-09-24 09:29:24 +02:00
commit 6d5236baa6

View File

@ -521,14 +521,15 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
bool doSpecular = gstate.isUsingSpecularLight(i);
bool poweredDiffuse = gstate.isUsingPoweredDiffuseLight(i);
WRITE(p, " mediump float dot%i = max(dot(toLight, worldnormal), 0.0);\n", i);
if (poweredDiffuse) {
WRITE(p, " mediump float dot%i = pow(dot(toLight, worldnormal), u_matspecular.a);\n", i);
// Ugly NaN check. pow(0.0, 0.0) may be undefined, but PSP seems to treat it as 1.0.
// 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.)
WRITE(p, " if (!(dot%i < 1.0) && !(dot%i > 0.0))\n", i, i);
WRITE(p, " if (dot%i == 0.0 && u_matspecular.a == 0.0) {\n", i);
WRITE(p, " dot%i = 1.0;\n", i);
} else {
WRITE(p, " mediump float dot%i = dot(toLight, worldnormal);\n", i);
WRITE(p, " } else {\n");
WRITE(p, " dot%i = pow(dot%i, u_matspecular.a);\n", i, i);
WRITE(p, " }\n");
}
const char *timesLightScale = " * lightScale";
@ -555,7 +556,7 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
break;
}
WRITE(p, " diffuse = (u_lightdiffuse%i * %s) * max(dot%i, 0.0);\n", i, diffuseStr, i);
WRITE(p, " diffuse = (u_lightdiffuse%i * %s) * dot%i;\n", i, diffuseStr, i);
if (doSpecular) {
WRITE(p, " dot%i = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n", i);
WRITE(p, " if (dot%i > 0.0)\n", i);