2013-05-05 66 views
0

的我有2個trinagles與座標:理解Z軸

static float squareCoords[] = { 
    // red triangle 
    0.0f, 0.0f, 0.5f, 
    0.25f, 0.5f, 0.5f, 
    0.5f, 0.0f, 0.5f, 

    //black triangle 
    -0.1f, -0.1f, 0.1f, 
    0.15f, 0.4f, 0.1f, 
    0.4f, -0.1f, 0.1f, 
}; 

描繪順序:

private short drawOrder[] = { 
      0, 2, 1, 
      3, 5, 4, 
    }; 

然後我與glDrawElements繪製它和黑三角是總是在紅色前面。改變Z座標沒有結果。看起來像是第二個黑色Tringle,這就是爲什麼它總是在前面。幫助我理解發生了什麼以及哪裏是問題。

回答

2

也許你沒有通過glEnable(GL_DEPTH_TEST)進行深度測試?

或者,您的投影矩陣可能被設置爲使得Z座標在轉換到標準化設備座標期間變得「擠壓」在一起。檢查你的近平面和遠平面,並且可能將遠平面或近平面拉出。

+0

沒有投影矩陣,GL_DEPTH_TEST幫助。因此,如果GL_DEPTH_TEST或Projection矩陣未設置,OpenGL只是通過忽略z座標的順序繪製元素? – Faceles 2013-05-05 18:58:36

+0

是的;如果沒有深度測試,對象將按照提交順序對幀緩衝區作出貢獻,新的東西會覆蓋舊的東西。投影矩陣(在固定功能流水線中)或着色器的動作(在可編程流水線中;通常投影矩陣的概念仍然保留,只是烘焙到着色器中)定義哪個輸入座標產生哪個輸出座標。在啓用GL_DEPTH_TEST的情況下,到輸出/ NDC空間的轉換可能導致事物「足夠接近」以進行z對戰或排序與您預期的不同。 – leander 2013-05-05 19:04:06

+0

通過深度測試,根據您使用的深度函數('glDepthFunc'),較新的對象或者以每個片段爲基礎對幀緩衝區作出貢獻。所以默認的深度函數 - GL_LESS' - 「如果傳入的深度值小於存儲的深度值,則通過」。這是在轉換之後 - 如果您在世界座標中向下看-Z軸,這意味着*更大的* z值將在前面。另見'gluLookAt'等=) – leander 2013-05-05 19:10:44