【问题标题】:Zbuffer rules for gl_Positiongl_Position 的 Zbuffer 规则
【发布时间】:2011-09-17 10:01:08
【问题描述】:

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

【问题讨论】:

    标签: opengl clipping zbuffer


    【解决方案1】:

    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(警告:透视矩阵近/远平面与深度范围有 nothing。不要混淆两者)。所以它将 NDC 空间中 Z 的 [-1, 1] 映射到窗口空间中的 [near, far]。

    这些是“规则”。

    【讨论】:

      【解决方案2】:

      你使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        相关资源
        最近更新 更多