gpt4 book ai didi

c++ - 在 opengl 阴影映射中将顶点深度信息存储在纹理中

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:03 25 4
gpt4 key购买 nike

我目前正在将阴影贴图(准确地说是级联阴影贴图)编程到我的 C++ opengl 引擎中。因此,我想要一个包含我的光源和我的阴影贴图中每个像素之间的距离的纹理。我应该使用哪种纹理类型?

我看到有一个GL_DEPTH_COMPONENT纹理内部格式,但是它将我想要给纹理的数据缩放到[0,1]。我是否应该在创建阴影贴图时反转一次长度,然后在最终渲染期间反转第二次以取回实际长度?好像没什么用!

有没有一种方法可以使用纹理来存储长度而不用将它们反转 2 次? (一次在创建纹理时,一次在使用过程中)。

最佳答案

我不确定你说的反转是什么意思(我敢肯定你不是说要反转距离,因为这是行不通的)。您所做的是将到光源的距离转换为 [0,1] 范围。

这可以通过为光源的 View 构建一个普通的投影矩阵并将其应用于阴影贴图构建过程中的顶点来完成。通过这种方式,它们到光源的距离被写入深度缓冲区(您可以通过 glCopyTexSubImage 或 FBO 将具有 GL_DEPTH_COMPONENT 格式的纹理连接到深度缓冲区)。在最后一步中,您当然会使用相同的投影矩阵来使用投影纹理计算阴影贴图的纹理坐标(使用 GLSL 时使用 sampler2DShadow 采样器)。

但这种变换不是线性的,因为深度缓冲区在观察者(或本例中的光源)附近具有更高的精度。另一个缺点是您必须知道距离值的有效范围(光源影响的最远点)。使用着色器(我假设你这样做),你可以通过将到光源的距离除以这个最大距离来使这个线性变换,然后手动将它分配给片段的深度值(GLSL 中的 gl_FragDepth) ,这可能就是您所说的“反转”的意思。

可以通过对光距离使用浮点纹理并将距离写为颜色 channel 然后自己在最终 channel 中执行深度比较(使用正常 sampler2D)。但线性过滤浮点纹理仅在较新的硬件上受支持,我不确定这是否会比每个片段的单个分割更快。但这种方式的优点是,这为“方差阴影贴图”之类的东西开辟了道路,这对于普通的 ubyte 纹理(因为精度低)和深度纹理都不会很好地工作。

所以总而言之,GL_DEPTH_COMPONENT 只是 ubyte 纹理(缺乏必要的精度,因为 GL_DEPTH_COMPONENT 应该至少有 16 位精度)和浮点纹理之间的一个很好的折衷(在旧硬件上速度不快或完全不支持)。但是由于其定点格式,您无法绕过 [0,1] 范围内的转换(无论是线性还是投影)。我不确定浮点纹理是否会更快,因为你只保留一个分区,但如果你使用的是支持线性(甚至三线性) float 纹理过滤和 1 或 2 个组件 float 纹理和渲染目标的最新硬件,可能值得一试。

当然,如果您使用固定功能管道,您只有 GL_DEPTH_COMPONENT 作为一个选项,但关于您的问题,我假设您正在使用着色器。

关于c++ - 在 opengl 阴影映射中将顶点深度信息存储在纹理中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751836/

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