首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL:防止在每个着色器程序中造成迷雾

OpenGL:防止在每个着色器程序中造成迷雾
EN

Stack Overflow用户
提问于 2018-07-17 18:09:53
回答 2查看 464关注 0票数 0

我目前在我的一个顶点着色器中制造了一个雾,下面的代码是:

代码语言:javascript
复制
float Distance = length(PositionToCam.xyz);
Visibility = exp(-pow((Distance*Density), Gradient));
Visibility = clamp(Visibility, 0.0, 1.0);

然后,我在片段着色器中使用Visibility,如下所示:

代码语言:javascript
复制
FragColor = mix(vec4(SkyColor, 1.0), FragColor, Visibility);

雾工作正常,但问题是,它只适用于这个特定的着色器,而我希望雾适用于一切。

,我怎么能有一种全局着色器来处理场景中每一个元素上的雾呢?

EN

回答 2

Stack Overflow用户

发布于 2018-07-18 16:10:34

从德哈斯的答案可以工作,但这可能是一个痛苦的结合计算在每一个阴影。

另一种方法是使用后处理传递,其中使用深度缓冲区计算到摄像机的距离,然后对后处理传递的像素阴影中的所有片段应用相同的算法。

你需要渲染你以前的场景颜色和深度的纹理,以便能够做后处理。

票数 1
EN

Stack Overflow用户

发布于 2018-07-17 18:39:31

我怎样才能有一种全球着色器来处理雾的每一个元素的现场?

您需要将fog计算合并到您打算用于呈现对象的每个程序对象中。

这并不一定意味着您必须手动复制源代码。然而,您将需要一些基本的策略来管理您的着色器。

  1. 您可以将多个着色器对象链接到一起进行一个阶段。这意味着您可以创建一个单独的顶点着色器,它只包含一个类似于fogCalculations()的函数,只需从所有其他顶点着色器调用它(当然,还可以链接对象)。碎片阴影部分也是如此。
  2. 您还可以编程组合不同阶段的字符串,并在需要的地方基本上注入fog代码。

还要注意,你的雾计算是错误的。您的visibility不是一个线性性质,但它将是线性内插的(嗯,线性的w.r.t。透视除以之前的空间,实际的计算在屏幕空间上将是非线性的,但这在这里并不重要)。如果你有一个大三角形,大致延伸到观察方向,而一个小物体基本上位于大三角形的中心,它将得到一个与三角形中心不同的可视值。此外,当您的三角形被剪裁时,visibility也将关闭新形成的顶点在交点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51387832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档