4

这是我对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 缓冲和裁剪!那么规则是什么?

4

2 回答 2

9

gl_Position 的值在 OpenGL 所谓的“剪辑空间”中。它是一个齐次坐标系。特别是,剪辑空间的 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]。

这些就是“规则”。

于 2011-06-17T18:39:11.340 回答
0

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

Depth Buffer 的值介于 0 和 1(最大深度)之间,使用选择 GL_LEQUAL 这意味着所有内容都将被绘制到屏幕上,因为深度值将小于或等于 1。

为了更清楚,请访问: http ://www.zeuscmd.com/tutorials/opengl/11-Depth.php

于 2011-06-17T18:53:04.350 回答