Unity中的闪光效果

时间:2019-01-06 14:37:36

标签: c# unity3d shader unity3d-shaders

我正在尝试为松树上的纹理添加闪光效果。如其他线程所建议的那样,我尝试使用此处http://developer.amd.com/wordpress/media/2012/10/Shopf-Procedural.pdf(P.22)中的代码。但是我无法将其应用于我的着色器。

float glitter (float3 pos, float3 viewVec){
        float3 fp = frac(0.7 * pos + 9 * snoise3D( pos * 0.04).r + 0.1 * viewVec);

        fp *= (1 - fp);
        float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));

        return glitter;
    }



    void surf (Input IN, inout SurfaceOutputStandard o) {

        float glitterValue = (glitter(IN.worldPos, IN.viewDir));
        glitterValue = clamp(0.0f, 1.0f, glitterValue);


        float2 uv_polar = cartesianToPolarCord(IN.uv_MainTex);

        float factor = pow(uv_polar.x * 1.1f, 5.0f);
        factor = clamp(0.0f, 1.0f, factor);
        factor = lerp(factor, factor * (snoise2D(IN.uv_MainTex * 5.0f) * 0.5f + 0.5f), 0.3);

        fixed4 c = lerp(_TreeColor, _SnowColor, factor);

        //c = glitterValue;

        o.Albedo = c.rgb;

        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Alpha = c.a;
    }
    ENDCG

树最初看起来像这样:

pine tree without glittering effect

现在,我希望闪光功能的结果会在纹理中产生许多小的白色火花。因此,如果我仅使用闪闪发光功能的值(取消注释c =闪闪发光值列)作为颜色,则树应变为黑色,并带有许多白色小火花。

但它看起来更像是这样:

pine tree with glittering effect

我是从我的闪光函数中获取了错误的值,还是我只是错误地将其应用了?

1 个答案:

答案 0 :(得分:0)

好吧,我知道了。问题是我的松树林的规模。这是一个非常小的比例,而闪光值通常适用于更大的比例。这意味着我得到的大白点实际上是我想要的火花,但是规模更大。

我通过在worldPos和viewDir中添加一个因素来修复它

float glitterValue = (glitter(500*IN.worldPos, 500*IN.viewDir));

您已经可以看到具有2,5,10或100之类的因子的效果。 因此,如果遇到类似的问题,请尝试使用其他值。