2011-12-04 125 views
0

VC++ 2010,OpenGL中,GLSL,SDLGLSL法線貼圖着色器發出

所以我有兩個主要問題。我希望主要解決第一個問題:我使用的法線貼圖着色器不適用於指向正或負x方向的法線。 z和y似乎工作得很好(測試立方體上的紋理和法線)。

編輯:它似乎不是x方向上的法線,因爲當我旋轉幾何圖形時,正面四面體仍然可以工作。所以它似乎無論是最初面向x的工作沒有工作。

下面是一些簡單的測試幾何:

glBegin(GL_QUADS); 
    glNormal3f(0.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 0.0f, 1.0f); 
glEnd(); 
glBegin(GL_QUADS); 
    glNormal3f(-1.0f, 0.0f, 0.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f); 
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0f, 2.0f, -1.0f); 
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0f, 0.0f, -1.0f); 
glEnd(); 

的Vertex Shader

#define MAX_LIGHTS 8 
#define NUM_LIGHTS 1 

varying vec3 lightVec[MAX_LIGHTS]; 
varying vec3 viewVec; 

attribute vec4 glTangent4f; 

void main(void) 
{ 
    gl_Position = ftransform(); 
    gl_TexCoord[0] = gl_MultiTexCoord0; 

    vec3 n = normalize(gl_NormalMatrix * gl_Normal); 
    vec3 t = normalize(gl_NormalMatrix * glTangent4f.xyz); 
    vec3 b = cross(n, t); 

    vec3 v; 
    vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex); 
    int i; 
    for (i=0; i<NUM_LIGHTS; ++i) 
    { 
     vec3 lVec = gl_LightSource[i].position.xyz - vVertex; 
     v.x = dot(lVec, t); 
     v.y = dot(lVec, b); 
     v.z = dot(lVec, n); 
     lightVec[i] = v; 
    } 

    vec3 vVec = -vVertex; 
    v.x = dot(vVec, t); 
    v.y = dot(vVec, b); 
    v.z = dot(vVec, n); 
    viewVec = v; 
} 

片段着色器

#define MAX_LIGHTS 8 
#define NUM_LIGHTS 1 

varying vec3 lightVec[MAX_LIGHTS]; 
varying vec3 viewVec; 

uniform sampler2D colorMap; 
uniform sampler2D normalMap; 

void main (void) 
{ 
    vec2 uv = gl_TexCoord[0].st * 4.0; 
    vec4 base = texture2D(colorMap, uv); 
    vec4 final_color = vec4(0.2, 0.2, 0.2, 1.0) * base; 
    vec3 vVec = normalize(viewVec); 
    vec3 bump = normalize(texture2D(normalMap, uv).xyz * 2.0 - 1.0); 
    vec3 R = reflect(-vVec, bump); 

    int i; 
    for (i=0; i<NUM_LIGHTS; ++i) 
    { 
     vec3 lVec = normalize(lightVec[i]); 
     float diffuse = max(dot(lVec, bump), 0.0); 
     vec4 vDiffuse = gl_FrontLightProduct[i].diffuse * diffuse * base; 
     final_color += vDiffuse; 

     float specular = pow(clamp(dot(R, lVec), 0.0, 1.0), gl_FrontMaterial.shininess); 
     vec4 vSpecular = gl_FrontLightProduct[i].specular * specular * diffuse; 
     final_color += vSpecular; 
    } 

    gl_FragColor = final_color; 
} 

的另一個問題(這是我做的並不一定ñ EED解決權這一刻)是定向光的鏡面反射似乎與相機

+0

與你期望的相比,有什麼/沒有發生? – slugonamission

+1

着色器缺少'#版本'指令。它們是編譯着色器所必需的。 – pmr

+0

我期待看到正常映射工作在面向x方向的第二組幾何體上。 – grep

回答

2
attribute vec4 glTangent4f; 

跟着你在哪裏其實提供這個價值?這是一個頂點屬性,但是你的渲染代碼似乎沒有提供任何東西。

+0

這將是一個很好的開始,讓我檢查我的代碼。 – grep

+0

我該如何去通過這個表面切線程序? – grep

0

「我該如何去通過這個表面切線程序?」

你計算了對象的正切基數嗎?我記得波前對象通常不包含頂點切線數據,在這種情況下,您需要在分析波前數據後計算切線基礎。 從代碼的外觀來看,您似乎沒有任何切線數據。

您可以在頂點着色器中進行切線近似,也可以使用正常值。

我實際上並不知道如何將切線數據傳遞給程序,因爲您沒有使用VBO。

編輯:

我現在看到我做的,你是從3D文件格式,這不加載數據愚蠢的假設,但你仍然需要計算切線地方。