2014-03-12 56 views
0

我可以在openGL中成功處理屏幕上的3d對象。OpenGL屏幕座標

要添加2D效果,我想我可以簡單地關閉頂點着色器中的矩陣乘法(或給出單位矩陣),然後我提供的「頂點」就是屏幕座標。

但2個簡單的三角形拒絕顯示(方0,0,100,100,嘗試了各種深度,但是相同的代碼工作正常,如果我給它一個旋轉矩陣。

任何想法?

static const char gVertexShader[] = 
    "attribute vec3 coord3d;\n" 
    "uniform mat4 mvp;\n" 
    "void main() {\n" 
    "gl_Position = mvp*vec4(coord3d,1.0);\n" 
    "}\n"; 

- >

static const char gVertexShader[] = 
    "attribute vec3 coord3d;\n" 
    "uniform mat4 mvp;\n" 
    "void main() {\n" 
    "gl_Position = vec4(coord3d,1.0);\n" 
    "}\n"; 

編輯:我無法得到任何使用單位矩陣作爲轉換來展示,但我可以這樣做,用這個一個:

glm::mat4 view = glm::lookAt(glm::vec3(0.0, 0.0, -5), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0)); 
    glm::mat4 pers = glm::perspective(.78f, 1.0f*screenWidth/screenHeight, 0.1f, 10.0f); 
    xform = pers * view * glm::mat4(1.0f); 

你不得不調整-5完全填滿屏幕...

+0

如果你想用二維繪製東西,那麼在透視投影中使用正交投影是非常有用的。 – user3256930

回答

2

gl_Position輸出的頂點着色器的不期望clip space座標,不是窗口的空間。剪輯空間座標將被最終轉換爲正常的設備空間,並最終使用視口變換轉換爲窗口空間座標。

如果要直接使用頂點的窗口空間座標,可以簡單地使用視口變換的反轉作爲投影矩陣(當使用正交投影時,剪輯空間將與標準化設備空間相同,所以你不需要關心)。

在NDC中,(-1,-1)是左下角的核心,而(1,1)是右上角的,因此很容易看出您需要的是規模和翻譯,您不要甚至不需要一個完整的矩陣,這些轉換將很好地結束,因爲GPU可以非常有效地處理乘加操作。

+0

我可以使用任何工作的座標系統。所以要確認如果我使用剪輯空間-1,-1到1,1它應該工作?什麼是NDC?我正在使用opengl es(電話) – AndrewStone

+0

嗯...沒有工作。 – AndrewStone

+0

@ArewrewStone:你究竟做了什麼沒有奏效。使用(-1,-1,z,1)(以[-1,1]中的z作爲剪輯空間座標)將映射到左下角(實際上,_pixel_的外角,而不僅僅是中心您選擇的視口的角點像素)。 – derhass