From 986f3a60980949f2ec394ed170d9f95d74d5cc4f Mon Sep 17 00:00:00 2001 From: vincentlj Date: Thu, 9 Jan 2014 17:08:23 +0000 Subject: [PATCH] OGL32CTX: Remove implicitly defined uniforms in normalmap git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14982 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- data/shaders/normalmap.frag | 5 +++-- data/shaders/normalmap.vert | 14 +++++++++----- src/graphics/callbacks.cpp | 11 +++++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/data/shaders/normalmap.frag b/data/shaders/normalmap.frag index 55b66e563..4b56d5d00 100644 --- a/data/shaders/normalmap.frag +++ b/data/shaders/normalmap.frag @@ -5,11 +5,12 @@ uniform sampler2D normalMap; //The bump-map noperspective in vec3 tangent; noperspective in vec3 bitangent; noperspective in vec3 normal; +in vec2 uv; void main() { // normal in Tangent Space - vec3 TS_normal = 2.0 * texture2D (normalMap, gl_TexCoord[0].st).rgb - 1.0; + vec3 TS_normal = 2.0 * texture2D (normalMap, uv).rgb - 1.0; // Because of interpolation, we need to renormalize vec3 Frag_tangent = normalize(tangent); vec3 Frag_bitangent = normalize(cross(normal, tangent)); @@ -20,7 +21,7 @@ void main() FragmentNormal = normalize(FragmentNormal); - gl_FragData[0] = texture2D (texture, gl_TexCoord[0].st); + gl_FragData[0] = texture2D (texture, uv); gl_FragData[1] = vec4(0.5 * FragmentNormal + 0.5, gl_FragCoord.z); gl_FragData[2] = vec4(0.); } diff --git a/data/shaders/normalmap.vert b/data/shaders/normalmap.vert index 7e2a40cb8..32b14aaa1 100644 --- a/data/shaders/normalmap.vert +++ b/data/shaders/normalmap.vert @@ -1,14 +1,18 @@ #version 130 +uniform mat4 ModelViewProjectionMatrix; +uniform mat4 TransposeInverseModelView; + noperspective out vec3 tangent; noperspective out vec3 bitangent; noperspective out vec3 normal; +out vec2 uv; void main() { - gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - normal = gl_NormalMatrix * gl_Normal; - tangent = gl_NormalMatrix * gl_MultiTexCoord1.xyz; - bitangent = gl_NormalMatrix * gl_MultiTexCoord2.xyz; - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + uv = gl_MultiTexCoord0.st; + normal = (TransposeInverseModelView * vec4(gl_Normal, 1.)).xyz; + tangent = (TransposeInverseModelView * gl_MultiTexCoord1).xyz; + bitangent = (TransposeInverseModelView * gl_MultiTexCoord2).xyz; + gl_Position = ModelViewProjectionMatrix * gl_Vertex; } diff --git a/src/graphics/callbacks.cpp b/src/graphics/callbacks.cpp index 9b6533438..ecf1f01cf 100644 --- a/src/graphics/callbacks.cpp +++ b/src/graphics/callbacks.cpp @@ -31,6 +31,17 @@ using namespace core; void NormalMapProvider::OnSetConstants(IMaterialRendererServices *srv, int) { + core::matrix4 ModelViewProjectionMatrix = srv->getVideoDriver()->getTransform(ETS_PROJECTION); + ModelViewProjectionMatrix *= srv->getVideoDriver()->getTransform(ETS_VIEW); + ModelViewProjectionMatrix *= srv->getVideoDriver()->getTransform(ETS_WORLD); + core::matrix4 TransposeInverseModelView = srv->getVideoDriver()->getTransform(ETS_VIEW); + TransposeInverseModelView *= srv->getVideoDriver()->getTransform(ETS_WORLD); + TransposeInverseModelView.makeInverse(); + TransposeInverseModelView = TransposeInverseModelView.getTransposed(); + + srv->setVertexShaderConstant("ModelViewProjectionMatrix", ModelViewProjectionMatrix.pointer(), 16); + srv->setVertexShaderConstant("TransposeInverseModelView", TransposeInverseModelView.pointer(), 16); + if (!firstdone) { s32 texture = 0;