以下是我对opengl的设置,以防它们很重要:
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;基于gl_Position.w的z缓冲和裁剪仍然是正确的!那么规则是什么呢?
发布于 2011-06-18 02:39:11
gl_Position的值在OpenGL所说的“剪辑空间”中。它是一个homogeneous coordinate system。特别是,剪辑空间的XYZ范围是-W +W。因此,每个顶点都在其自己的剪辑空间中。
我不确定你说的“规则是什么”是什么意思。裁剪空间gl_Position在均匀空间中相对于视图区域进行裁剪。因此,它们被剪裁到每个顶点的-W +W区域。很难想象在射影均匀空间中,但数学是可行的,所以无关紧要。
之后,将裁剪的顶点转换到归一化设备坐标(NDC)空间。这意味着将剪辑空间的XYZ除以W。所有这些顶点都在- 1,1的范围内。
从那里开始进行视口变换。glViewport参数将顶点从-1,1ndc空间缩放到视口区域。这会将点转换到窗口空间;它们正是在窗口空间中被光栅化的。
窗口空间的XY由glViewport控制。窗口空间的Z值由glDepthRange控制。默认深度范围的近值为0,远值为1(警告:透视矩阵近/远平面与深度范围没有任何共同之处。请不要混淆这两者)。因此它将NDC空间中Z的-1,1映射到窗口空间中的near和far。
这些都是“规则”。
发布于 2011-06-18 02:53:04
使用glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);
Depth Buffer有一个介于0和1 (最大深度)之间的值,选择GL_LEQUAL意味着所有内容都将绘制到屏幕上,因为depth值将小于或等于1。
更清晰的信息,请访问:http://www.zeuscmd.com/tutorials/opengl/11-Depth.php
https://stackoverflow.com/questions/6390051
复制相似问题