gl_Position的Zbuffer规则
题
这是我对opengl的设置,以防万一: 通用标签
有一阵子,我认为剪切平面将适用于gl_Position.z在-1到1之外的任何值。 但是,即使我在着色器中将gl_Position.z强制设为常数,也是如此: 通用标签
仍然存在基于gl_Position.w的正确z缓冲和裁剪!那有什么规则?
解决方案
gl_Position的值在OpenGL所谓的“剪辑空间”中。这是同质坐标系。特别是,剪辑空间的XYZ范围是[-W,+ W]。因此,每个顶点都在其自己的剪辑空间中。
我不确定“规则是什么”的确切含义。裁剪空间gl_Position被裁剪为均匀空间中的视图区域。因此,将它们裁剪到每个顶点的[-W,+ W]区域。很难想象在射影齐次空间中会发生这种情况,但是数学计算出来了,所以没关系。
之后,将修剪的顶点转换为归一化设备坐标(NDC)空间。这意味着将剪辑空间的XYZ除以W。所有这些顶点都在[-1,1]范围内。
从此处开始进行视口转换。 glViewport
参数将顶点从[-1,1] NDC空间缩放到视口区域。这会将点转换为窗口空间;光栅化是在窗口空间中。
窗口空间的XY由glViewport
控制。窗口空间的Z值由基因组标签代码控制。默认深度范围是近值0和远值1(警告:远/近平面的透视矩阵与深度范围没有什么共同之处。不要混淆两者)。因此它将NDC空间中Z的[-1,1]映射到窗口空间中[near,far]。
这些就是“规则”。
其他提示
您使用 glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL);
深度缓冲区的值在0到1(最大深度)之间,请使用选定的GL_LEQUAL,这意味着一切都会被绘制到屏幕上,因为深度值小于或等于1。
有关更多信息,请访问: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php