我正在尝试使用 GLSL 顶点和片段着色器使我的 3D 对象具有模糊的边缘。我发现我必须为此使用高斯模糊。
目前,它只是使用blendFunc blend
和rgbGen identity
进行半透明填充的TGA纹理。此纹理也不受光 ( surfaceparm nolightmap
) 的影响。而且,是的,它是 Quake 3 BSP @ Irrlicht 引擎。 :)
这是我试图让它看起来像的图像( 这实际上不是一盏灯,只是一个用来模拟光线的画笔 ):
我试过应用许多着色器,但它们都不起作用。关于在哪里可以找到类似实现的任何想法?或者也许有另一种方法可以做到这一点?
P.S.也许还有其他一些聪明的方法来绘制光线?
想到的一些想法...
我对引擎没有任何经验,但一种方法可能是计算对象的轮廓并挤出它,对挤出的位应用渐变。你可以保持线性插值,从每个顶点插值,或者使用片段着色器给它一个更像衰减的高斯。我做过的最接近挤压的是 conservative rasterization ,它有点相似。 stencil shadows/shadow volumes 需要剪影,尽管在这里我想从相机的角度挤出剪影,而不是光的。
另一种方法是先使用 rendering to a texture,然后将 blur it 添加回场景中。处理深度测试在这里可能很棘手。也许使用广告牌放回现场。
一种非常便宜的方法可能是使用预先模糊的纹理广告牌。或者也许是几层具有模糊纹理和附加混合的纵横交错的固定几何图形。对于加法混合,在边缘渐变为黑色的明亮浅色 - 不需要 alpha。像这样的东西?
我刚刚找到了 this approach too 。静态几何图形再次添加混合,但您追求的是更柔和的边缘。锥体几何形状的法线和距尖端的距离用于猜测厚度。深度缓冲区还用于限制事件对象在锥体内部的厚度。
转向更基于物理的照明模型,您可以绘制一些边界几何图形,并为每个像素计算出视线穿过带有 ray-cone intersection test 的光锥的距离。然后根据距离添加灯光。按距离缩放的简单加法可能就足够了,而无需计算多重散射和吸收近似值。这非常接近 deferred shading 。特别是聚光灯。
顺便说一句,如果您想通过模型计算每像素的距离,我记得在 GPU gems 或 nvidia 的一篇演示论文中阅读了我认为的一种很好的方法。只需将所有背面的眼睛空间深度渲染为纹理添加混合,然后仅对正面使用减法混合。纹理将包含每像素距离。
扩展上面的内容,从头到尾遍历阴影贴图,积累光线。 1D Min-Max Mipmaps 看起来是一种令人印象深刻的加速方式。
仅供引用,因为我认为它在灯的情况下效果不佳:Volumetric Light Scattering as a Post-Process
来自随机谷歌搜索的链接和图像,不是确定的