这是我对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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top