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