2013-10-09 63 views
0

我在因特網http://rioki.org/2013/03/07/glsl-skybox.html上發現了立方體貼圖環境紋理(實際渲染天空盒)的代碼。但我不明白它爲什麼有效。瞭解Opengl着色器代碼 - cubemap?

void main() 
{ 
    mat4 r = gl_ModelViewMatrix; 
    r[3][0] = 0.0; 
    r[3][1] = 0.0; 
    r[3][2] = 0.0; 

    vec4 v = inverse(r) * inverse(gl_ProjectionMatrix) * gl_Vertex; 

    gl_TexCoord[0] = v; 
    gl_Position = gl_Vertex; 
} 

所以gl_Vertex是世界座標,但我們怎麼乘以通過投影矩陣的逆獲得,然後模型視圖矩陣?

這是我用我的畫天空盒

void SkyBoxDraw(void) 
{ 
GLfloat SkyRad = 1.0f; 

glUseProgramObjectARB(glsl_program_skybox); 
glDepthMask(0); 
glDisable(GL_DEPTH_TEST); 
// Cull backs of polygons 
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
glEnable(GL_TEXTURE_CUBE_MAP); 

glBegin(GL_QUADS); 
    ////////////////////////////////////////////// 
    // Negative X 
    glTexCoord3f(-1.0f, -1.0f, 1.0f); 
    glVertex3f(-SkyRad, -SkyRad, SkyRad); 

    glTexCoord3f(-1.0f, -1.0f, -1.0f); 
    glVertex3f(-SkyRad, -SkyRad, -SkyRad); 

    glTexCoord3f(-1.0f, 1.0f, -1.0f); 
    glVertex3f(-SkyRad, SkyRad, -SkyRad); 

    glTexCoord3f(-1.0f, 1.0f, 1.0f); 
    glVertex3f(-SkyRad, SkyRad, SkyRad); 
    ...... 
    ...... 
glEnd(); 

glDepthMask(1); 
glDisable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
glDisable(GL_TEXTURE_CUBE_MAP); 

glUseProgramObjectARB(0); 

} 
+0

你能分享教程鏈接嗎?你確定它是正確的嗎?請參閱http://www.ozone3d.net/tutorials/glsl_texturing_p04.php#part_43教程以供參考 – fen

+0

我從這裏找到它: http://www.rioki.org/2013/03/07/glsl-skybox。 html –

回答

2

所以gl_Vertex是在世界座標的代碼...

不不不,gl_Vertex是在對象/模型空間除非我在其他地方看到一些代碼(例如,如何在程序的實際非着色器部分中計算頂點位置),否則指示:)在OpenGL中,我們從對象空間跳到眼睛/視圖/相機空間,當我們乘以組合的Model * View矩陣。正如你所看到的,同樣的座標空間有很多名字,但是對象空間絕對不是世界空間的同義詞。將r3設置爲< 0,0,0,1>基本上可以在不影響方向的情況下重新定位相機的原點,當您想知道的只是立方體貼圖查找的方向時,這非常有用。

也就是說,簡而言之,您在使用立方體貼圖時需要什麼。只是一個簡單的方向矢量。事實上,textureCube (...)需要一個3D矢量而不是4D,這是一個直接的暗示,它正在尋找一個方向而不是位置。位置矢量有第4個分量,方向不對。所以,從技術上講,如果你想將這個着色器移植到現代OpenGL上,你可能會使用out vec3和012KB關閉v,因爲v.w是不必要的。

...但是,我們通過乘以投影矩陣的逆矩陣和模型矩陣得到什麼?

基本上,當你乘以這些矩陣的倒數時,你將會取消投影。這個着色器唯一有意義的方法是,如果您在頂點傳遞的座標是在剪輯空間中定義的。因此,不要從對象空間通過GL管道走到最後在屏幕空間中結束,而是希望得到相反的結果,只有因爲視口不參與着色器,我們無法處理屏幕空間。有關如何計算頂點位置的更多信息應該清楚。

+0

您能否將「原​​點定位」改爲「移動到原點,保持方向」。定向可以被理解爲「轉向」的同義詞,這絕對不會將相機轉向特定點。它移動它的位置,保持它的視線方向。 – datenwolf

+0

哎呀,好點:) –

+0

以及清理東西感謝。我沒有做任何特別的事情,我把這個代碼用於我的天空盒。這只是我爲其紋理使用立方體貼圖的一個框。 但是這個代碼的作品。但我仍然沒有明白,如你所說,只有座標位於剪輯空間時纔有意義。 –