Блестящий эффект в Unity - PullRequest
       59

Блестящий эффект в Unity

0 голосов
/ 06 января 2019

Я пытаюсь добавить блестящий эффект к текстуре на сосне. Я попытался использовать код здесь http://developer.amd.com/wordpress/media/2012/10/Shopf-Procedural.pdf (стр. 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 = glitterValue) в качестве цвета, дерево должно стать черным с множеством маленьких белых искр.

Но вместо этого это выглядит примерно так:

pine tree with glittering effect

Получаю ли я ложные значения из своей функции блеска или я просто неправильно их применяю?

1 Ответ

0 голосов
/ 07 января 2019

Хорошо, я понял это. Проблема в масштабе моего соснового леса. Это очень маленький масштаб, и значения блеска обычно применяются к большему масштабу. Это означает, что большие белые пятна, которые я получаю, на самом деле являются искрами, которые я хочу, но в большем масштабе.

Я исправил это, добавив фактор в worldPos и ​​viewDir

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

Вы уже можете видеть эффект с такими факторами, как 2,5,10 или 100. Так что, если у вас похожая проблема, попробуйте другие значения.

...