gpt4 book ai didi

opengl - 如何在片段着色器中使用 gl_FragCoord.z 在现代 OpenGL 中线性渲染深度?

转载 作者:行者123 更新时间:2023-12-04 02:32:10 30 4
gpt4 key购买 nike

我阅读了很多关于使用片段着色器获取深度的信息。



http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=234519

但我还是不知道gl_FragCoord.z是线性的。

GLSL 规范说它的范围是屏幕空间中的 [0,1],但没有提到它是否是线性的。

我认为线性至关重要,因为我将使用渲染模型来匹配来自 Kinect 的深度图。

那么如果不是线性的,如何在世界空间中线性化呢?

最佳答案

but I still don't know whether or not the gl_FragCoord.z is linear.



是否 gl_FragCoord.z是否线性取决于投影矩阵。
而对于正交投影 gl_FragCoord.z是线性的,对于透视投影,它不是线性的。

一般来说,深度( gl_FragCoord.zgl_FragDepth )计算如下(见 GLSL gl_FragCoord.z Calculation and Setting gl_FragDepth ):
float ndc_depth = clip_space_pos.z / clip_space_pos.w;
float depth = (((farZ-nearZ) * ndc_depth) + nearZ + farZ) / 2.0;

投影矩阵描述了从场景的 3D 点到视口(viewport)的 2D 点的映射。它从眼睛空间变换到剪辑空间,剪辑空间中的坐标通过除以剪辑坐标的 w 分量转换为归一化设备坐标(NDC)

正交投影

在正交投影中,眼睛空间中的坐标被线性映射到标准化的设备坐标。

Orthographic Projection

正交投影矩阵:
r = right, l = left, b = bottom, t = top, n = near, f = far 

2/(r-l) 0 0 0
0 2/(t-b) 0 0
0 0 -2/(f-n) 0
-(r+l)/(r-l) -(t+b)/(t-b) -(f+n)/(f-n) 1

在正交投影中,Z 分量由 计算。线性函数 :
z_ndc = z_eye * -2/(f-n) - (f+n)/(f-n)

Orthographic Z function

透视投影

在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口(viewport)的 2D 点的映射。相机平截头体(截断的金字塔)中的眼睛空间坐标映射到立方体(标准化设备坐标)。

Perspective Projection

透视投影矩阵:
r = right, l = left, b = bottom, t = top, n = near, f = far

2*n/(r-l) 0 0 0
0 2*n/(t-b) 0 0
(r+l)/(r-l) (t+b)/(t-b) -(f+n)/(f-n) -1
0 0 -2*f*n/(f-n) 0

在透视投影中,Z 分量由 计算。有理函数 :
z_ndc = ( -z_eye * (f+n)/(f-n) - 2*f*n/(f-n) ) / -z_eye

Perspective Z function

深度缓冲区

由于标准化设备坐标在 (-1,-1,-1) 到 (1,1,1) 范围内,Z 坐标必须映射到深度缓冲区范围 [0,1]:
depth = (z_ndc + 1) / 2 

Then if it is not linear, how to linearize it in the world space?



要将深度缓冲区的深度转换为原始 Z 坐标,必须知道投影(正交或透视)以及近平面和远平面。

正交投影
n = near, f = far

z_eye = depth * (f-n) + n;

透视投影
n = near, f = far

z_ndc = 2.0 * depth - 1.0;
z_eye = 2.0 * n * f / (f + n - z_ndc * (f - n));

如果透视投影矩阵已知,则可以按如下方式完成:
A = prj_mat[2][2]
B = prj_mat[3][2]
z_eye = B / (A + z_ndc)

另见答案

How to recover view space position given view space depth value and ndc xy

关于opengl - 如何在片段着色器中使用 gl_FragCoord.z 在现代 OpenGL 中线性渲染深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7777913/

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