2014-09-10 139 views
2

所以我對OpenGL相當陌生,我一直在嘗試使用GLSL,當然,我遇到了一些問題。首先,我應該注意到我目前只繪製了一個單一的三角形。其次,這裏是我的(很簡單)着色器:困惑於GLSL和OpenGL

// Vertex Shader 

#version 330 

in vec3 vertex_position; 

void main() 
{ 
    gl_Position = vec4(vertex_position, 1.0); 
} 

// Fragment Shader 

#version 330 

out vec4 fragColour; 

void main() { 
    fragColour = vec4(0.0, 1.0, 0.0, 1.0); 
} 

這工作的很好,畫一個三角形。大。現在,我想編輯頂點着色引擎,從而取代

gl_Position = vec4(vertex_position, 1.0) 

我做

gl_Position = vec4(vertex_position, 2.0) 

果然,它放大了我的三角形。所以我想,也許如果我走在Z從我的頂點着色器和設置在W等於它,我能得到深度感,所以我這樣做:

// Vertex Shader 

#version 330 

in vec3 vertex_position; 

void main() 
{ 
    gl_Position = vec4(vertex_position, vertex_position.z); 
} 

但很可惜,當我運行程序,它什麼也沒有顯示。如果人們想知道,這裏是我的頂點:

float points[] = { 
    0.0f, 0.5f, 1.0f, 
    0.5f, -0.5f, 1.0f, 
    -0.5f, -0.5f, 1.0f 
}; 

而且,我應該說,我注意到,在float points[] Z值更改爲0以外的任何東西,使三角形出於某種原因不可見的部分。

回答

4

其中w座標爲0的「頂點」被認爲是無限遠的,所以它不會被顯示。 0的w用於表示方向,而不是點。

設置w等於z刪除深度任何意義。點[x, y, z, w]的實際三維座標是[ x/w, y/w, z/w ](這是均勻座標原理)。

通常,您將w固定爲1.0,並通過x,yz設置頂點位置。

+0

好的,如果我將'float points []'的Z'編輯爲1,它應該設置W = 1,但是這仍然不顯示任何內容。不是'vertex_position.z'應該得到給定頂點的Z值嗎?如果Z值爲1,那麼我的代碼應該自動將W設置爲1? – Nooble 2014-09-10 20:25:49

+0

@Nooble:恩,NDC中Z = 1的座標表示您將頂點從剪輯空間中移出,因此所有的頂點都會被裁剪掉。你應該閱讀如何正確轉換。即建立一個模型和一個投影矩陣以及這些工作。 – datenwolf 2014-09-10 20:58:29

+0

@Angew我知道如何使用矩陣,我只是對此感到好奇。除零之外的任何_at_ _all_似乎都將其推出剪輯空間。例如,0.5,介於-1到1之間。說到-1到1,它是否包含在內? – Nooble 2014-09-10 22:40:31