2013-07-16 63 views
0

下面列出了法線貼圖的着色器代碼。儘管如此,由於生成的圖像不正確,所以代碼有問題。法線似乎沒有了。其他功能似乎工作正常,所以我認爲問題是與着色器。任何想法可能是錯的?GLSL法線貼圖問題

頂點着色器

#version 150 

in vec3 position; 
in vec2 texcoord; 
in vec3 normal; 
in vec3 tangent; 
in vec3 bitangent; 

out vec2 Texcoord; 
out vec3 VertexPos_World; 
out vec3 LightDir_Tan; 

uniform vec3 lightPos0_World; 
uniform mat4 model; 
uniform mat4 view; 
uniform mat4 proj; 

void main() 
{ 
    gl_Position = proj * view * model * vec4(position, 1.0); 
    Texcoord = texcoord;  
    VertexPos_World = (model * vec4(position, 1.0)).xyz; 

    vec3 normal_Cam = (view * model * vec4(normal, 1.0)).xyz; 
    vec3 tangent_Cam = (view * model * vec4(tangent, 1.0)).xyz; 
    vec3 bitangent_Cam = (view * model * vec4(bitangent, 1.0)).xyz; 

    mat3 TBN = transpose(mat3(tangent_Cam, bitangent_Cam, normal_Cam)); 

    vec3 lightDir_Cam = lightPos_Cam - vertexPos_Cam; 
    LightDir_Tan = TBN * lightDir_Cam; 
} 

片段着色器

#version 150 

in vec2 Texcoord; 
in vec3 VertexPos_World; 
in vec3 LightDir_Tan; 

out vec4 outColor; 

uniform vec3 lightPos0_World; 
uniform vec3 lightColor0; 
uniform float lightPower0; 

uniform vec3 ambientColor; 
uniform vec3 diffuseColor; 
uniform sampler2D tex0; 
uniform sampler2D tex0normal; 

void main() 
{ 
    float lightDistance = length(lightPos0_World - VertexPos_World); 

    vec3 materialDiffuseColor = texture(tex0, Texcoord).xyz * diffuseColor; 
    vec3 materialAmbientColor = ambientColor * materialDiffuseColor; 

    vec3 n = normalize(texture(tex0normal, Texcoord).rgb * 2.0 - 1.0); 
    vec3 l = normalize(LightDir_Tan); 
    float diff = clamp(dot(n,l), 0, 1); 

    outColor.rgb = 
      materialAmbientColor + 
      materialDiffuseColor * lightColor0 * lightPower0 * diff/(lightDistance * lightDistance); 
} 
+0

你可以發佈你發送給GPU的內容嗎? –

回答

2

這可能不是唯一的問題,但在你的着色器您有:

vec3 normal_Cam = (view * model * vec4(normal, 1.0)).xyz; 
vec3 tangent_Cam = (view * model * vec4(tangent, 1.0)).xyz; 
vec3 bitangent_Cam = (view * model * vec4(bitangent, 1.0)).xyz; 

這應該是:

vec3 normal_Cam = (view * model * vec4(normal, 0.0)).xyz; 
vec3 tangent_Cam = (view * model * vec4(tangent, 0.0)).xyz; 
vec3 bitangent_Cam = (view * model * vec4(bitangent, 0.0)).xyz; 

使用0.0代替1.0因爲這些方向向量,而不是立場,所以你想忽略矩陣中的翻譯。另外,您應該在應用程序中乘以這些矩陣,並在着色器中使用統一的view_model(否則,您會按照每個頂點而不是每個模型執行此工作)。

1

你法線最有可能非常關閉。確保不要提交包含8個頂點的立方體,而是提交一個包含每個面4個頂點的立方體,以便您可以發送每個面的正確法線。否則,插值器將簡單地使用來自索引的相鄰三角形的法線,這就是導致該問題的原因。

+0

爲了調試法線,嘗試設置'outColor.rgb = n'或'-n'。與使用完整的Phong着色器相比,查看發生的事情要容易得多。 –