gpt4 book ai didi

opengl - 从片段着色器访问深度缓冲区

转载 作者:行者123 更新时间:2023-12-05 09:23:20 26 4
gpt4 key购买 nike

我有一个关于雾的想法,我想在 OpenGl 中实现:渲染场景后,在整个视口(viewport)上渲染一个四边形。在片段着色器中,此四边形在该位置对深度缓冲区进行采样并更改其颜色/alpha,以使该像素根据需要变得模糊。

现在我知道我可以使用链接到纹理的深度缓冲区来渲染场景,正常渲染场景然后渲染雾,将纹理传递给它,但这是一次渲染太多了。我希望能够要么

  • 直接从片段着色器访问当前深度缓冲区
  • 能够将场景渲染一次,同时渲染到普通深度缓冲区/屏幕和雾化纹理。

这可能吗?

最佳答案

您的想法(访问目标帧缓冲区以获取输入)会导致禁止的反馈循环。

(…), but this is one rendering too many.

你为什么这么认为?您不必将整个场景渲染成一个新场景,只需将雾覆盖在它上面即可。

I wish to be able to either

  • Directly access the current depth buffer from the fragment shader

如果您只想访问新渲染片段的深度,只需使用 gl_FragCoord.z,这个变量(只应读取以保持性能)保存新片段将具有的深度缓冲区值。

查看 GLSL 规范:

The variable gl_FragCoord is available as an input variable from within fragment shadersand it holds the window relative coordinates (x, y, z, 1/w) values for the fragment.If multi-sampling, this value can be for any location within the pixel, or one of thefragment samples. The use of centroid in does not further restrict this value to beinside the current primitive. This value is the result of the fixed functionality thatinterpolates primitives after vertex processing to generate fragments. The z componentis the depth value that would be used for the fragment’s depth if no shader containedany writes to gl_FragDepth. This is useful for invariance if a shader conditionallycomputes gl_FragDepth but otherwise wants the fixed functionality fragment depth.

  • Be able to render the scene once, both to the normal depth buffer/screen and to the texture for fog.

首先正常渲染场景有什么问题,深度进入单独的深度纹理附件,然后渲染雾,最后合成它们。计算复杂度不会因此而增加。仅仅因为它有更多的步骤,它并没有比您想象的解决方案做更多的工作,因为各个步骤变得更简单了。

关于opengl - 从片段着色器访问深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22554631/

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