我目前在我的一个顶点着色器中制造了一个雾,下面的代码是:
float Distance = length(PositionToCam.xyz);
Visibility = exp(-pow((Distance*Density), Gradient));
Visibility = clamp(Visibility, 0.0, 1.0);然后,我在片段着色器中使用Visibility,如下所示:
FragColor = mix(vec4(SkyColor, 1.0), FragColor, Visibility);雾工作正常,但问题是,它只适用于这个特定的着色器,而我希望雾适用于一切。
,我怎么能有一种全局着色器来处理场景中每一个元素上的雾呢?
发布于 2018-07-18 16:10:34
从德哈斯的答案可以工作,但这可能是一个痛苦的结合计算在每一个阴影。
另一种方法是使用后处理传递,其中使用深度缓冲区计算到摄像机的距离,然后对后处理传递的像素阴影中的所有片段应用相同的算法。
你需要渲染你以前的场景颜色和深度的纹理,以便能够做后处理。
发布于 2018-07-17 18:39:31
我怎样才能有一种全球着色器来处理雾的每一个元素的现场?
您需要将fog计算合并到您打算用于呈现对象的每个程序对象中。
这并不一定意味着您必须手动复制源代码。然而,您将需要一些基本的策略来管理您的着色器。
fogCalculations()的函数,只需从所有其他顶点着色器调用它(当然,还可以链接对象)。碎片阴影部分也是如此。还要注意,你的雾计算是错误的。您的visibility不是一个线性性质,但它将是线性内插的(嗯,线性的w.r.t。透视除以之前的空间,实际的计算在屏幕空间上将是非线性的,但这在这里并不重要)。如果你有一个大三角形,大致延伸到观察方向,而一个小物体基本上位于大三角形的中心,它将得到一个与三角形中心不同的可视值。此外,当您的三角形被剪裁时,visibility也将关闭新形成的顶点在交点。
https://stackoverflow.com/questions/51387832
复制相似问题