From 946754d7beb3b4e67df4f93cbe3a51b1754403a6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 9 Jan 2013 00:34:39 +0100 Subject: [PATCH] Added specular mapping Former-commit-id: 329bcfc6b3d92809538c9416578329f11c6ef56f --- include/Nazara/Renderer/Enums.hpp | 3 +- src/Nazara/Renderer/ShaderBuilder.cpp | 47 ++++++++++++++++++++------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index 769f97f41..af6cedfcc 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -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 diff --git a/src/Nazara/Renderer/ShaderBuilder.cpp b/src/Nazara/Renderer/ShaderBuilder.cpp index 7cb843039..c0c6d506e 100644 --- a/src/Nazara/Renderer/ShaderBuilder.cpp +++ b/src/Nazara/Renderer/ShaderBuilder.cpp @@ -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) @@ -233,7 +255,10 @@ namespace sourceCode += fragmentColorKW + " = vec4(light, MaterialDiffuse.w)"; if (flags & nzShaderBuilder_DiffuseMapping) - sourceCode += " * texture2D(MaterialDiffuseMap, vTexCoord)"; + 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"; }