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

And*_*nai 5 opengl 3d shader render irrlicht

我正在尝试使用GLSL顶点和片段着色器使我的3D对象具有模糊的边缘.我发现我必须使用高斯模糊.

目前它只是一个TGA纹理,半透明填充使用blendFunc blendrgbGen identity.此纹理也不受light(surfaceparm nolightmap)的影响.而且,是的,它是Quake 3 BSP @ Irrlicht引擎.:)

这是我试图让它看起来像的图像(这实际上不是光,只是模拟光线的刷子):图片

我尝试过应用无数着色器,但它们都不起作用.关于在哪里可以找到类似实现的任何想法?或者也许有另一种方法可以做到这一点?

PS也许有一些其他智能方法来绘制光线?

joz*_*yqk 11

想到的一些想法......

  • 我对引擎没有任何经验,但一种方法可能是计算对象的轮廓并挤出它,对拉伸位应用渐变.您可以保留插值线性,从每个顶点插值,或者可以使用片段着色器为其提供更高斯的衰减.我最接近挤压的是保守的光栅化,这有点类似.模板阴影/阴影卷需要剪影,虽然在这里我想从相机的角度挤出轮廓,而不是光线.

    在此输入图像描述

  • 另一种方法是首先渲染纹理,模糊它然后将其添加回场景.处理深度测试在这里可能很棘手.也许使用广告牌重新回到场景中.

    在此输入图像描述

  • 一种非常便宜的方式可能只是使用预先模糊的纹理广告牌.或者可能是几层纵横交错的固定几何体,具有模糊的纹理和添加剂混合.对于添加剂混合,明亮的光色在边缘逐渐变黑 - alpha不是必需的.像这样的东西?

    在此输入图像描述

    在此输入图像描述

  • 我也发现了这种方法.静态几何与添加剂混合再次,但你有更柔和的边缘.锥形几何形状的法线和距尖端的距离用于猜测厚度.深度缓冲区还用于限制事件对象在锥体内的厚度.

    在此输入图像描述

  • 通过更加基于物理的照明模型,您可以绘制一些边界几何体,并且每个像素通过光锥相交测试计算出观察光线穿过光锥的距离.然后根据距离添加光线.在不计算多次散射和吸收近似的情况下,通过距离缩放的简单加法可能就足够了.这与延迟着色非常接近.特别是聚光灯.

    顺便说一下,如果你想通过一个模型计算出每像素的距离,我记得我在GPU宝石或者nvidia的演示文章中读到了一个很好的方法.只需使用添加剂混合纹理渲染所有背面的眼睛空间深度,然后仅使用与正面的减色混合.纹理将包含每像素距离.

    在此输入图像描述

  • 扩展上述内容,全程走完阴影贴图,累积光线.1D Min-Max Mipmaps看起来像是一种令人印象深刻的加速方式.

    在此输入图像描述

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

    在此输入图像描述

来自随机谷歌搜索的链接和图像,而不是确定的