Answers:
好吧,当被要求设计任何着色器时,我们应该首先将其分解为较小的问题。就像要注意的那样,闪闪发光的效果实际上并不能使着色器看起来不错,但是仅使用其中之一,整体照明和效果就不会那么好。
首先,让我们说明不直接包含在着色器中的内容:
其次,让我们将实际的着色器分解为单独的效果:
请注意,此类织物具有无限多个法线,但此处描述的技术近似于最重要的法线
为了逼近最重要的法线,一种方法是使用纹理坐标并计算网格的切线,而不是计算 ñ。L您计算出1-(NT)。
此处有完整说明。您可能需要在片段着色器中实现它,而不是他们所谈论的顶点技术。其他各向异性模型也可以应用。
现在为闪闪发光的效果:
可以在世界空间/局部纹理空间或屏幕空间中单独完成此操作。
我可以考虑的算法使用图像处理技术(假设网格具有纹理坐标)。
请注意,上面的图像只是最大滤镜的示例,将其应用于噪声将得到类似于星场的效果。
高斯滤波器应用于最大噪声的示例。
注意,此技术可能需要对实时着色器进行重大优化。
有一篇有趣的文章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);