gpt4 book ai didi

opengl - gl_Position 的 Zbuffer 规则

转载 作者:行者123 更新时间:2023-12-04 23:08:04 27 4
gpt4 key购买 nike

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

最佳答案

gl_Position 的值在 OpenGL 所谓的“剪辑空间”中。这是一个 homogeneous coordinate system .特别是,剪辑空间的 XYZ 范围是 [-W, +W]。所以每个顶点都在自己的剪辑空间中。

我不确定您所说的“规则是什么”到底是什么意思。裁剪空间 gl_Position 被裁剪到同质空间中的 View 区域。所以它们被剪裁到每个顶点的 [-W, +W] 区域。很难想象在射影齐次空间中,但数学是可行的,所以没关系。

之后,剪裁的顶点被转换到标准化设备坐标 (NDC) 空间。这意味着将剪辑空间的 XYZ 除以 W。所有这些顶点都在 [-1, 1] 范围内。

从那里开始,视口(viewport)变换发生。 glViewport参数将顶点从 [-1, 1] NDC 空间缩放到视口(viewport)区域。这将点转换为窗口空间;它们是在窗口空间中被光栅化的。

窗口空间的XY由glViewport控制.窗口空间的 Z 值由 glDepthRange 控制。 .默认深度范围是近值 0 和远值 1(警告:透视矩阵近/远平面与深度范围没有任何共同点。不要混淆两者)。因此它将 NDC 空间中 Z 的 [-1, 1] 映射到窗口空间中的 [near, far]。

这些就是“规则”。

关于opengl - gl_Position 的 Zbuffer 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com