opengl混合透视和正交投影
opengl mixed perspective and ortographic projection
如何在 openGL 中混合使用正射投影和透视投影?
必须在屏幕 space 中绘制一些 2d 元素(无缩放、旋转等。)
这些 2d 元素有一个 z 位置,它们必须出现在其他 3d 元素的 front/behind 中。
所以我设置地形投影,绘制所有 2d 元素,然后设置透视投影并绘制所有 3d 元素。
结果是所有 2d 元素都绘制在顶部。似乎正投影的z值和透视投影的z值不兼容(GL_DEPTH_TEST)。
所有 2d 和所有 3d 元素单独工作都很好,问题是当我尝试混合它们时。
预期投影是否会改变 z 值?以什么方式?
是否可以将 orto 投影的 z 值与透视投影的 z 值混合用于深度测试,或者整个概念有缺陷?
裸机opengl1.5
It seems that the z values from the orto projection and the z values from the perspective projection are not compatible (GL_DEPTH_TEST).
确实如此。透视变换将 Z 值非线性映射到深度缓冲区值。解决这个问题的通常方法是在透视传递后将深度缓冲区复制到深度纹理中,并将其用作正交绘制内容的片段着色器中的附加输入,反转深度输入中的非线性并比较传入的 Z与之协调;然后适当丢弃。
也可以在透视绘制的几何片段着色器中发出线性深度值,但是透视投影的深度非线性有其目的;没有它,你会在最重要的地方失去深度精度,接近视点。
如何在 openGL 中混合使用正射投影和透视投影? 必须在屏幕 space 中绘制一些 2d 元素(无缩放、旋转等。) 这些 2d 元素有一个 z 位置,它们必须出现在其他 3d 元素的 front/behind 中。 所以我设置地形投影,绘制所有 2d 元素,然后设置透视投影并绘制所有 3d 元素。 结果是所有 2d 元素都绘制在顶部。似乎正投影的z值和透视投影的z值不兼容(GL_DEPTH_TEST)。
所有 2d 和所有 3d 元素单独工作都很好,问题是当我尝试混合它们时。 预期投影是否会改变 z 值?以什么方式? 是否可以将 orto 投影的 z 值与透视投影的 z 值混合用于深度测试,或者整个概念有缺陷?
裸机opengl1.5
It seems that the z values from the orto projection and the z values from the perspective projection are not compatible (GL_DEPTH_TEST).
确实如此。透视变换将 Z 值非线性映射到深度缓冲区值。解决这个问题的通常方法是在透视传递后将深度缓冲区复制到深度纹理中,并将其用作正交绘制内容的片段着色器中的附加输入,反转深度输入中的非线性并比较传入的 Z与之协调;然后适当丢弃。
也可以在透视绘制的几何片段着色器中发出线性深度值,但是透视投影的深度非线性有其目的;没有它,你会在最重要的地方失去深度精度,接近视点。