2011-06-17 53 views
4

Zbuffer規則下面是我設置的OpenGL,櫃面他們沒關係:爲GL_POSITION

glViewport(0,0,w,h); //w=800, h=600 
glShadeModel(GL_SMOOTH); 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
glClearDepth(1.0f); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

有一段時間我認爲裁剪平面將適用於任何事情上gl_Position.z爲-1外1。 但即使我強迫gl_Position.z一個常數着色器:

gl_Position.z = -0.01; 

仍然有正確的Z緩衝和裁剪基於gl_Position.w!那麼規則是什麼?

回答

9

gl_Position的值在OpenGL調用的「剪輯空間」中。這是一個homogeneous coordinate system。特別是,剪輯空間的XYZ範圍是[-W,+ W]。所以每個頂點都在它自己的剪輯空間中。

我不確定您的意思是「什麼是規則」。剪輯空間gl_Position在齊次空間中被裁剪爲視圖區域。所以它們被剪切到每個頂點的[-W,+ W]區域。很難想象,在一個投影同質空間中,但數學運算出來,所以沒關係。

之後,將剪切的頂點轉換爲標準化的設備座標(NDC)空間。這意味着將剪輯空間的XYZ除以W.所有這些頂點都在[-1,1]範圍內。

從那裏,視口轉換髮生。參數glViewport將頂點從[-1,1] NDC空間縮放到視區區域。這將點轉換爲窗口空間;它在窗口空間中被光柵化。

窗口空間的XY由glViewport控制。窗口空間的Z值由glDepthRange控制。默認的深度範圍是近似值0和遠值1(警告:近視/遠視平面的透視矩陣與深度範圍有共同的沒有,不要混淆兩者)。因此它將NDC空間中Z的[-1,1]映射到窗口空間中的[near,far]。

那些是「規則」。

0

您使用 glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL);

深度緩衝具有0和1(最大深度),使用選擇GL_LEQUAL這意味着一切會被繪製到屏幕上,作爲深度值將是小於或等於1。

爲了更清楚訪問之間的值: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

+1

我很樂意知道我是否在這裏說錯了 – codingBuddha

相關問題