模糊边缘的着色器,或者如何绘制光线。

7
我正在尝试使用GLSL顶点和片段着色器使我的3D对象具有模糊的边缘。我发现我必须使用高斯模糊来实现这一点。
目前,它只是一个带有半透明填充的TGA纹理,使用blendFunc blendrgbGen identity。该纹理也不受光线影响(surfaceparm nolightmap)。是Quake 3 BSP @ Irrlicht引擎。 :)
这里是我想让它看起来像的图片(这实际上不是光,只是用来模拟光线的刷子):image 我尝试了应用许多着色器,但没有一个能够工作。有什么想法可以找到类似实现的地方吗?或者还有其他方法可以画出光线吗?
P.S.也许还有其他聪明的方法来绘制光线?
1个回答

14

一些想法...

  • 我没有使用这个引擎的经验,但一种方法可能是计算对象的轮廓并将其挤出,对挤出的部分应用渐变。您可以保留插值为线性,从每个顶点插值,或者也许使用片段着色器给它更加高斯的衰落效果。我所做过最接近挤出的事情是保守光栅化,有点类似。轮廓需要用于模板阴影/阴影体积,但这里我考虑的是从相机视角挤出轮廓,而不是从光源角度挤出。

    图片描述

  • 另一种方法是先渲染到纹理,然后进行模糊处理,再添加回场景中。处理深度测试可能有些棘手。也许可以使用广告牌将其放回场景中。

    图片描述

  • 一个非常便宜的方法可能是只使用预先模糊的纹理广告牌。或者使用几层交叉固定几何形状和模糊纹理,并进行加法混合。对于加法混合,亮光颜色在边缘处淡出至黑色-不需要alpha通道。类似这样?

    图片描述

    图片描述

  • 我刚发现了这个方法。再次使用静态几何体和加法混合,但是可以得到你想要的较柔和的边缘。通过圆锥几何体的法线和距离来猜测其厚度。如果物体位于圆锥内部,则还使用深度缓冲区限制厚度。

    enter image description here

  • 为了更符合物理模型的光照模型,您可以绘制一些包围几何体,并且对于每个像素计算视线穿过光锥的距离,使用射线锥相交测试。然后根据距离添加光照。简单的加法按比例缩放距离可能足以满足要求,而无需计算多次散射和吸收近似值。这非常接近延迟着色,尤其是聚光灯。

    顺便提一下,如果您想计算模型中每个像素的距离,我记得在GPU Gems或Nvidia的演示论文中读到过一个不错的方法。只需使用加法混合渲染所有背面的视景深度到纹理中,然后仅使用减法混合前面的表面。该纹理将包含每个像素的距离。

    enter image description here

  • 扩展上述方法,通过遍历阴影图累计光照。使用1D最小-最大多级贴图似乎可以加速此过程。

    enter image description here

  • 仅供参考,因为我认为它在灯的情况下不会很有效:作为后处理的体积光散射

    输入图片描述

链接和图片来自随机谷歌搜索,非定论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接