如何创建闪光效果?


9

我正在尝试为我的实时着色器创建一个闪光的效果,但是我不知道如何。

这是一个示例,另一个示例

在此处输入图片说明

我可以使用什么技术来实现?


它可以通过后处理效果来实现,类似于光晕效果,但是在下采样阶段应用图案(星形纹理)。这一切只是猜测而已。
akaltar 2014年

1
法线和镜面贴图不会让您通过纹理执行此操作吗?
JohnB 2014年

我使用法线贴图进行了一些测试。但是困难的是要使它们根据视图方向和光线方向闪烁。
2014年

Answers:


10

好吧,当被要求设计任何着色器时,我们应该首先将其分解为较小的问题。就像要注意的那样,闪闪发光的效果实际上并不能使着色器看起来不错,但是仅使用其中之一,整体照明和效果就不会那么好。

首先,让我们说明不直接包含在着色器中的内容:

  1. 阴影不是着色器的一部分,它是通过单独的阴影传递来完成的。
  2. 假设存在环境光遮挡(特别是问题中显示的该图像特别不使用实时渲染器,但这是一个假设)。

其次,让我们将实际的着色器分解为单独的效果:

  1. 有一个各向异性的照明,这对于着色器的整体外观非常重要。其背后的原因是,实际的材料包含织物,这些有光泽的织物使光反射具有方向性偏差,从而使的反射光

在此处输入图片说明

在此处输入图片说明 请注意,此类织物具有无限多个法线,但此处描述的技术近似于最重要的法线

为了逼近最重要的法线,一种方法是使用纹理坐标并计算网格的切线,而不是计算 ñL您计算出1-(NT)。

此处有完整说明。您可能需要在片段着色器中实现它,而不是他们所谈论的顶点技术。其他各向异性模型也可以应用。

现在为闪闪发光的效果:

可以在世界空间/局部纹理空间或屏幕空间中单独完成此操作。

我可以考虑的算法使用图像处理技术(假设网格具有纹理坐标)。

  • 使用纹理坐标在网格表面上生成高频2D噪声,Perlin噪声似乎是不错的选择。
  • 使用3x3内核对噪声应用最大滤镜。这将产生类似于下图的效果,并且此处将描述max滤镜。

在此处输入图片说明

请注意,上面的图像只是最大滤镜的示例,将其应用于噪声将得到类似于星场的效果。

  • 完成此操作后,请对噪声应用具有一定偏差的高斯滤波器,以获得类似星形的形状。

在此处输入图片说明

高斯滤波器应用于最大噪声的示例。

  • 最后一步是将其与原始网格纹理和灯光结合起来。最好使用对原始网格纹理/颜色进行(|)或-ing二进制运算来完成此操作,这将仅从噪声中获取白色,并删除所有黑色像素。关于灯光(可能还有其他镜面贴图),最好的方法是添加灯光或使用以前合并的像素对其进行调制。您可能还需要发光后处理效果才能获得更好的发光。

注意,此技术可能需要对实时着色器进行重大优化。


3

有一篇有趣的文章AMD-入门程序

似乎火花比我想的要难。
体面的解决方案:使用3D位置索引3D噪波函数,添加视图矢量,使用frac函数进一步使事物随机化。

Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.