着色器 - 镜面闪光 - 闪亮效果

时间:2014-01-19 11:43:48

标签: opengl directx glsl shader hlsl

我正在尝试为我的实时着色器创建一个闪闪发光的效果,但我找不到任何好的资源来帮助我。

以下是一个例子:
enter image description here

是否有关于此类影响的白皮书或教程?

这种效果的原理是什么?

3 个答案:

答案 0 :(得分:1)

这不可能像使用法线贴图和高光贴图的纹理贴图一样简单。当光线处于必要的角度时,法线贴图会给闪光带一些“高度”和镜面反射贴图以使它们“闪耀”?

答案 1 :(得分:1)

有一篇有趣的文章AMD - Getting Procedural

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

耀:

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);

答案 2 :(得分:0)

之前我已经做了这个,然后是一个阈值,接着是一些模糊,然后是混合。在我的例子中,它是一个用于风格化视频的交互式着色器,因此控件是可调整的,但对于像游戏这样的东西,你可以静态地设置它们。

首先阈值输入图像,因此亮度低于阈值的所有内容都设置为透明黑色(RGBA = 0,0,0,0)。亮度等于或大于阈值的所有内容保持不变。

接下来,将方向模糊应用于阈值图像。

然后将与前一个指向90°的方向模糊应用于阈值图像。 (注意 - 不要将它应用于已经模糊的图像。这很重要!最终应该有3个图像 - 阈值图像,模糊图像和另一个模糊图像,模糊图像与第一个图像成90°。)

最后,使用简单的添加剂混合,将2个模糊图像添加到原始输入。 (你现在可以抛出阈值图像。)结果将是每个亮度高于阈值的像素现在都会有一个闪亮的交叉。如果你想要你可以使用超过2个模糊并调整它们的角度,你可以得到3或5个或更多点,但这意味着更多的传球。

编辑:有一件事我忘了提及 - 在你的视频中,看起来他们在对象上添加了随机白点的纹理,使其具有闪光般的外观。

此外,上述过滤过程应该应用于屏幕空间。