GLSL法线随着相机旋转而变化

时间:2014-08-23 13:41:34

标签: opengl glsl shader lighting normals

我知道同样的问题被多次询问,但不幸的是我无法找到问题的根源。

在教程的帮助下,我编写了一个小型GLSL着色器。现在它可以使用环境光并从法线贴图加载法线。问题是定向光似乎取决于我的视角。 这是我的着色器:

//Vertex Shader
#version 120
attribute vec3 position;
attribute vec2 texCoord;
attribute vec3 normal;
attribute vec3 tangent;

varying vec2 texCoord0;
varying mat3 tbnMatrix;
uniform mat4 transform;
void main(){
 gl_Position=transform * vec4(position, 1.0);
 texCoord0 = texCoord;
 vec3 n = normalize((transform*vec4(normal,0.0)).xyz);
 vec3 t = normalize((transform*vec4(tangent,0.0)).xyz);
 t=normalize(t-dot(t,n)*n);
 vec3 btTangent=cross(t,n);
 tbnMatrix=transpose(mat3(t,btTangent,n));
}


//Fragment Shader
#version 120
varying vec2 texCoord0;
varying mat3 tbnMatrix;
struct BaseLight{
  vec3 color;
  float intensity;
};

struct DirectionalLight{
  BaseLight base;
  vec3 direction;
};

uniform sampler2D diffuse;
uniform sampler2D normalMap;
uniform vec3 ambientLight;
uniform DirectionalLight directionalLight;

vec4 calcLight(BaseLight base, vec3 direction,vec3 normal){
  float diffuseFactor=dot(normal,normalize(direction));
  vec4 diffuseColor = vec4(0,0,0,0);
  if(diffuseFactor>0){
    diffuseColor=vec4(base.color,1.0)* base.intensity *diffuseFactor;
  }

  return diffuseColor;
}
vec4 calcDirectionalLight(DirectionalLight directionalLight ,vec3 normal){
    return calcLight(directionalLight.base,directionalLight.direction,normal);
}

void main(){

    vec3 normal =tbnMatrix*(255.0/128.0* texture2D(normalMap,texCoord0).xyz-255.0/256.0);
    vec4 totalLight = vec4(ambientLight,0)   +calcDirectionalLight(directionalLight, normal);
    gl_FragColor=texture2D(diffuse,texCoord0)*totalLight;
}
发送到着色器的

“transform”矩阵按以下方式计算:

viewProjection=m_perspective* glm::lookAt(CameraPosition,CameraPosition+m_forward,m_up);
glm::mat4 transform = vievProjection * object_matrix;

“object_matrix”是我直接从物理引擎得到的矩阵。(我认为它是定义物体在世界空间中的位置和旋转的矩阵,如果我错了,请纠正我。)

我猜测“变换”矩阵是正确计算的,因为所有对象都是在正确的位置绘制的。看起来这个问题与法线有关,因为如果我设置gl_FragColor = vec4(normal,0),颜色也会随着相机旋转而改变。

如果有人能指出我的错误,我将不胜感激

0 个答案:

没有答案