GPU: Correct specular exponent zero.
This commit is contained in:
parent
4816bfc1a6
commit
1c19bce514
4 changed files with 22 additions and 7 deletions
|
@ -589,7 +589,7 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage
|
|||
WRITE(p, " if (u_matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " ldot = 1.0;\n");
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " ldot = pow(ldot, u_matspecular.a);\n");
|
||||
WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
|
||||
|
@ -621,8 +621,13 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage
|
|||
if (doSpecular) {
|
||||
WRITE(p, " if (ldot >= 0.0) {\n");
|
||||
WRITE(p, " ldot = dot(normalize(toLight + float3(0.0, 0.0, 1.0)), worldnormal);\n");
|
||||
WRITE(p, " if (u_matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " ldot = 1.0;\n");
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
WRITE(p, " }\n");
|
||||
WRITE(p, " if (ldot > 0.0)\n");
|
||||
WRITE(p, " lightSum1 += u_lightspecular%i * %s * (pow(ldot, u_matspecular.a) %s);\n", i, specularStr, timesLightScale);
|
||||
WRITE(p, " lightSum1 += u_lightspecular%i * %s * ldot %s;\n", i, specularStr, timesLightScale);
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
WRITE(p, " lightSum0.rgb += (u_lightambient%i * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale);
|
||||
|
|
|
@ -683,7 +683,7 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask,
|
|||
WRITE(p, " if (u_matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " ldot = 1.0;\n");
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " ldot = pow(ldot, u_matspecular.a);\n");
|
||||
WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
|
||||
|
@ -715,8 +715,13 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask,
|
|||
if (doSpecular) {
|
||||
WRITE(p, " if (ldot >= 0.0) {\n");
|
||||
WRITE(p, " ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n");
|
||||
WRITE(p, " if (u_matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " ldot = 1.0;\n");
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n");
|
||||
WRITE(p, " }\n");
|
||||
WRITE(p, " if (ldot > 0.0)\n");
|
||||
WRITE(p, " lightSum1 += u_lightspecular%i * %s * (pow(ldot, u_matspecular.a) %s);\n", i, specularStr, timesLightScale);
|
||||
WRITE(p, " lightSum1 += u_lightspecular%i * %s * ldot %s;\n", i, specularStr, timesLightScale);
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
WRITE(p, " lightSum0.rgb += (u_lightambient%i * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale);
|
||||
|
|
|
@ -125,7 +125,7 @@ void Process(VertexData& vertex, bool hasColor) {
|
|||
|
||||
float specular_factor = Dot(H.Normalized(), vertex.worldnormal);
|
||||
float k = gstate.getMaterialSpecularCoef();
|
||||
specular_factor = pow(specular_factor, k);
|
||||
specular_factor = pspLightPow(specular_factor, k);
|
||||
|
||||
if (specular_factor > 0.f) {
|
||||
specular_color += lsc * msc * specular_factor * att * spot;
|
||||
|
|
|
@ -472,7 +472,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) {
|
|||
WRITE(p, " if (light.matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " dot%i = 1.0;\n", i);
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " dot%i = pow(dot%i, light.matspecular.a);\n", i, i);
|
||||
WRITE(p, " dot%i = pow(max(dot%i, 0.0), light.matspecular.a);\n", i, i);
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
|
||||
|
@ -504,8 +504,13 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) {
|
|||
if (doSpecular) {
|
||||
WRITE(p, " if (dot%i >= 0.0) {\n", i);
|
||||
WRITE(p, " dot%i = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n", i);
|
||||
WRITE(p, " if (light.matspecular.a == 0.0) {\n");
|
||||
WRITE(p, " dot%i = 1.0;\n", i);
|
||||
WRITE(p, " } else {\n");
|
||||
WRITE(p, " dot%i = pow(max(dot%i, 0.0), light.matspecular.a);\n", i, i);
|
||||
WRITE(p, " }\n");
|
||||
WRITE(p, " if (dot%i > 0.0)\n", i);
|
||||
WRITE(p, " lightSum1 += light.specular[%i] * %s * (pow(dot%i, light.matspecular.a) %s);\n", i, specularStr, i, timesLightScale);
|
||||
WRITE(p, " lightSum1 += light.specular[%i] * %s * dot%i %s;\n", i, specularStr, i, timesLightScale);
|
||||
WRITE(p, " }\n");
|
||||
}
|
||||
WRITE(p, " lightSum0.rgb += (light.ambient[%i] * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue