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

Posted

技术标签:

【中文标题】模糊边缘的着色器,或如何绘制光线【英文标题】:Shader for blurred edges, or how to draw light rays 【发布时间】:2015-02-24 03:34:20 【问题描述】:

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

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

这是我试图使它看起来像的图像(这实际上不是灯,只是模拟光线的画笔):

我尝试过应用许多着色器,但它们都不起作用。关于在哪里可以找到类似实施的任何想法?或者也许还有其他方法可以做到这一点?

附注也许还有其他一些聪明的方法来绘制光线?

【问题讨论】:

【参考方案1】:

想到的一些想法...

我对引擎没有任何经验,但一种方法可能是计算对象的轮廓并挤出它,对挤出的位应用渐变。您可以保留线性插值,从每个顶点进行插值,或者使用片段着色器为其提供更像高斯的衰减。我做过的最接近挤压的是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

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

【讨论】:

以上是关于模糊边缘的着色器,或如何绘制光线的主要内容,如果未能解决你的问题,请参考以下文章

自定义着色器不接收光线

着色器斜切多维数据集的边缘?

如何在着色器之后读取像素?

DirectX11 With Windows SDK--30 计算着色器:图像模糊索贝尔算子

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

html 黄色光线着色器