这是我对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缓冲和剪辑!那么规则是什么?
答案 0 :(得分: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]。
这些是“规则”。
答案 1 :(得分: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