2011-04-07 54 views
2

我有一個簡單的頂點着色器OpenGL的頂點着色器轉換和輸出

#version 330 core 

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

in vec3 in_Position; 

out vec3 pass_Color; 

void main(void) 
{    
    //gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0); 
    gl_Position = vec4(in_Position, 1.0); 
    pass_Color = vec3(1,1,1);  
} 

在我的客戶端代碼,我

glm::vec4 vec1(-1,-1,0,1);//first 
    glm::vec4 vec2(0,1,0,1);//second 
    glm::vec4 vec3(1,-1,0,1);//third 
    glm::mat4 m = projectionMatrix * viewMatrix * modelMatrix; 

    //translate on client side 
    vec1 = m * vec1; 
    vec2 = m * vec2; 
    vec3 = m * vec3; 

    //first vertex 
    vertices[0] = vec1.x; 
    vertices[1] = vec1.y; 
    vertices[2] = vec1.z; 
    //second 
    vertices[3] = vec2.x; 
    vertices[4] = vec2.y; 
    vertices[5] = vec2.z; 
    //third 
    vertices[6] = vec3.x; 
    vertices[7] = vec3.y; 
    vertices[8] = vec3.z; 

現在我的問題,如果我在着色器,沒有在不使用矩陣乘法客戶端代碼,這將使我成爲一個很好的三角形,使整個屏幕擴大,所以我把它的頂點着色器地圖座標系給它的座標系統中的屏幕x=-1..1y=-1..1

如果我在着色器中進行矩陣乘法,一切都很好。但是,如果我註釋掉了着色器中的代碼,並在客戶端上執行,我會得到奇怪的結果。它不應該產生相同的結果?

我是否錯誤地認爲頂點着色器gl_Position的輸出是2D座標,儘管它是vec4

感謝您的任何幫助。我真的很想了解頂點着色器的輸出是以頂點位置爲準的。

+0

的projectin字模其實修改一個vec4的最後一個組件,並且您不要忽略這最後的價值是很重要的。 opengl將gl_Position從{x,y,z,w}轉換爲{x/w,y/w,z/w,1} – Arne 2013-09-21 21:45:33

回答

3

問題在於你的着色器,因爲它只接受3個位置組件。如果座標不在投影空間中,可以將第4個座標設置爲1(就像你這樣做)。

當您在客戶端空間進行轉換時,結果是正確的4分量齊次向量。你只需要在你的頂點着色器使用它們as is

in vec4 in_Position. 
... 
gl_Position = in_Position. 
+0

謝謝。現在就開始工作了。還做了一個關於渲染管道的瞭解,並瞭解了視角劃分的發生。在我第一次閱讀時錯過了。 – Jeps 2011-04-07 14:37:43