Как кэшировать общие (для всех пикселей) переменные в ShaderLab? - PullRequest
0 голосов
/ 25 мая 2019

Предположим, у меня есть следующий шейдер:

Shader "Sprites/X"
{
    Properties
    {
        [HideInInspector] _MainTex("Sprite Texture", 2D) = "black" {}
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM

            // bla bla

            fixed4 frag(v2f i) : SV_Target
            {
                float a = calculateA();
                float b = calculateB();
                .
                .
                .
                float z = calculateZ();

                // Here the values above mix with x-y position of the pixel
                // and then return a color
            }
            ENDCG
        }
    }
}

В приведенном выше коде мне нужно вычислить значения переменных a - z из связанных функций calculateA() - calculateZ()(это просто пример обобщения).Предположим, что эти функции сложны и что они зависят от других свойств шейдера, которые меняются в каждом кадре, а не от самого пикселя.Мы знаем, что сложные функции вычисляются каждый раз для каждого пикселя.

Есть ли способ «кэшировать» эти значения, чтобы избежать вычисления каждый раз для каждого пикселя?В каждом кадре их значения одинаковы для всех пикселей.

В настоящее время я решаю проблему, устанавливая значения в скрипте C # с помощью:

gameObject.GetComponent<Renderer>().material.SetFloat("a", calculateA());
.
.
.
gameObject.GetComponent<Renderer>().material.SetFloat("z", calculateZ());

, но я предпочитаю поддерживатькод шейдера и сценария C # разделены.

1 Ответ

0 голосов
/ 27 мая 2019

Ну, это именно так, как вы бы это сделали:)

Это зависит от того, почему именно вы хотите избежать использования C #

  • Если указанный метод вычисляется исключительно из констант, то компилятор будет оптимизировать его.
  • Если метод имеет мало предсказуемых результатов Вы можете предварительно вычислить их в массив, объявленный в самом шейдере, или установить один раз из кода вместо каждого кадра.
  • Если таких предсказуемых результатов много, вы можете попробовать их выпекать. в текстуру, или, если вы можете использовать современный графический процессор, в структурированную буферы.
...