Страница 1 из 1

Создание Глобальной статической переменной на CG

СообщениеДобавлено: 24 июн 2017, 21:01
Roman777
Добрый день! Только-только начал изучать Shader Lab. Хочу понять, возможно ли определить такую Глобальную статичную переменную, чтобы она определена была только при вызове для первого пикселя, а в последующих принимала задаваемое в расчете предыдущего пикселя значение? Например в шейдере ниже хочу определить переменную flg при подсчете первого пикселя как true. А дальше она уже должна будет принимать значения в зависимости от условия. Пока каждый новый подсчет, переменная вначале всегда принимает значение true...
Синтаксис:
Используется csharp
Shader "Custom/MyShader" {
        Properties {
           t("t", Float ) = 0//_Time
        }
        SubShader {
            Cull off
                Pass{
                        CGPROGRAM
                    #pragma vertex vert_img
                    #pragma fragment frag
                    #pragma target 2.0
                    //3.0

                    #include "UnityCG.cginc"
                    float4 frag(v2f_img i) : COLOR {
                        float2 mcoord;
                        float4 color;
                        static bool flg=true;
                        mcoord.x = i.uv.x;
                        mcoord.y = i.uv.y;
                        static float n=1;
                        float temp=0.0;
                        if (trunc(fmod(_Time.y*10,20))==10.0){
                           flg=!flg;
                        }
                        if (flg){
                                temp=fmod(_Time.y*10,20);
                       
                        }
                        else {
//                          temp = temp +_Time.y/100;
                                temp=20.0-fmod(_Time.y*10,20);
                        }
                        if (fmod(mcoord.y*100,20)>0.0&&fmod(mcoord.y*100,20)<temp){
                            color= float4(0.0,0.0,1.0,1.0);
                        }
                        else{
                                                color= float4(1.0,1.0,1.0,1.0);
                        }
                        return color;
                    }

                        ENDCG
                }
        }
        FallBack "Diffuse"
}

Re: Создание Глобальной статической переменной на CG

СообщениеДобавлено: 24 июн 2017, 21:45
jetyb
чтобы она определена была только при вызове для первого пикселя, а в последующих принимала задаваемое в расчете предыдущего пикселя значение?

Никак, понятия "первого пикселя" нет, потому что пиксели обрабатываются параллельно на разных процессорных блоках.

Re: Создание Глобальной статической переменной на CG

СообщениеДобавлено: 24 июн 2017, 21:50
Roman777
Да тут смысл даже не косательно "первого" пикселя. Просто обычно static переменная определяется только первый раз, все остальные разы, когда она уже определена "переопределения" не происходит. Что же в контексте CG даёт эта static, я что-то разницы с ней и без неё не понял...?

Re: Создание Глобальной статической переменной на CG

СообщениеДобавлено: 25 июн 2017, 13:09
snezhok_13
В C++ у ключевого слова static до чертиков значений. Одно из которых "локальная в пределах модуля".
В Cg похожее значение, из документации:

static
Only usable on global variables. Marks the variable as ‘private’ to the program, and not visible externally.
Cannot be combined with uniform or varying

Предположу, что в отличие от uniform задать значение нельзя, поэтому применяется видимо только с константами. (popcorn)

Re: Создание Глобальной статической переменной на CG

СообщениеДобавлено: 25 июн 2017, 17:16
Roman777
snezock_13, не подскажите, что такое uniform в данном контексте?

Re: Создание Глобальной статической переменной на CG

СообщениеДобавлено: 26 июн 2017, 15:43
snezhok_13
Roman777 писал(а):snezock_13, не подскажите, что такое uniform в данном контексте?


Uniform-переменная в шейдере - единая для всех вершин/фрагментов. Матрицы преобразований постоянны для всех вершин, Сэмплеры текстур постоянны для всех фрагментов.