Added specular mapping

Former-commit-id: 329bcfc6b3d92809538c9416578329f11c6ef56f
This commit is contained in:
Lynix 2013-01-09 00:34:39 +01:00
parent 81472079c4
commit 946754d7be
2 changed files with 38 additions and 12 deletions

View File

@ -152,7 +152,8 @@ enum nzShaderBuilderFlags
nzShaderBuilder_Instancing = 0x04,
nzShaderBuilder_Lighting = 0x08,
nzShaderBuilder_NormalMapping = 0x10,
nzShaderBuilder_ParallaxMapping = 0x20
nzShaderBuilder_ParallaxMapping = 0x20,
nzShaderBuilder_SpecularMapping = 0x40
};
enum nzShaderLanguage

View File

@ -83,8 +83,8 @@ namespace
"uniform vec4 MaterialSpecular;\n";
}
/*if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "uniform sampler2D MaterialSpecularMap;\n";*/
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "uniform sampler2D MaterialSpecularMap;\n";
if (flags & nzShaderBuilder_Lighting)
sourceCode += "uniform vec4 SceneAmbient;\n";
@ -115,8 +115,12 @@ namespace
if (flags & nzShaderBuilder_Lighting)
{
sourceCode += "vec3 light = vec3(0.0, 0.0, 0.0);\n"
"vec3 normal = normalize(vNormal);\n"
sourceCode += "vec3 light = vec3(0.0, 0.0, 0.0);\n";
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "vec3 si = vec3(0.0, 0.0, 0.0);\n";
sourceCode += "vec3 normal = normalize(vNormal);\n"
"\n"
"for (int i = 0; i < LightCount; ++i)\n"
"{\n";
@ -143,8 +147,14 @@ namespace
"vec3 eyeVec = normalize(CameraPosition - vWorldPos);\n"
"vec3 reflection = reflect(-lightDir, normal);\n"
"\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n"
"light += specular * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n";
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "si";
else
sourceCode += "light";
sourceCode += " += specular * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"}\n";
if (glsl140)
@ -174,8 +184,14 @@ namespace
"vec3 eyeVec = normalize(CameraPosition - vWorldPos);\n"
"vec3 reflection = reflect(-lightDir, normal);\n"
"\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n"
"light += att * specular * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n";
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "si";
else
sourceCode += "light";
sourceCode += " += att * specular * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"}\n";
if (glsl140)
@ -212,8 +228,14 @@ namespace
"vec3 eyeVec = normalize(CameraPosition - vWorldPos);\n"
"vec3 reflection = reflect(-lightDir, normal);\n"
"\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n"
"light += att * specular * spot * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"float specular = pow(max(dot(reflection, eyeVec), 0.0), MaterialShininess);\n";
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += "si";
else
sourceCode += "light";
sourceCode += " += att * specular * spot * Lights[i].specular.xyz * MaterialSpecular.xyz;\n"
"}\n";
if (glsl140)
@ -235,6 +257,9 @@ namespace
if (flags & nzShaderBuilder_DiffuseMapping)
sourceCode += "*texture2D(MaterialDiffuseMap, vTexCoord)";
if (flags & nzShaderBuilder_SpecularMapping)
sourceCode += " + vec4(light, MaterialDiffuse.w)*texture2D(MaterialSpecularMap, vTexCoord)"; // Utiliser MaterialSpecular.w n'aurait aucun sens
sourceCode += ";\n";
}
else if (flags & nzShaderBuilder_DiffuseMapping)