Настоящие циклы и ветвления в SM 3.0

Посты сомнительного качества на тему шейдеров (для истории)

Настоящие циклы и ветвления в SM 3.0

Сообщение waruiyume 14 июн 2013, 10:42

Краем уха слышал, что это есть в SM 3.0. Их нужно как-то включат(директива компилятора) или в [unity 3D] это не работает?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 5000
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Настоящие циклы и ветвления в SM 3.0

Сообщение Guyver 14 июн 2013, 10:52

#pragma target 3.0

http://docs.unity3d.com/Documentation/C ... grams.html

в 3й модели не только честные циклы .. там вроде как и ветвления честные и много лимитов снято.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Настоящие циклы и ветвления в SM 3.0

Сообщение seaman 14 июн 2013, 11:22

#pragma target 3.0
Циклы точно работают. Только сильно не разгуляться - легко выйти за максимальное количество операторов.
seaman
Адепт
 
Сообщения: 7535
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Настоящие циклы и ветвления в SM 3.0

Сообщение waruiyume 14 июн 2013, 11:48

Сферический в вакууме тест:
Синтаксис:
Используется glsl
Shader "Custom/Test" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma target 3.0
                #pragma surface surf Lambert
                //#pragma only_renderers d3d9 opengl
                #pragma only_renderers d3d9

                sampler2D _MainTex;

                struct Input {
                        float2 uv_MainTex;
                };

                void surf (Input IN, inout SurfaceOutput o)
                {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                        o.Albedo = c.rgb;
                        for(int i=1; i<2; i++)
                        {
                                o.Albedo.r +=0.001;
                                if(o.Albedo.r>0.2)
                                {
                                        break;
                                }
                        }
                        o.Alpha = c.a;
                }
                ENDCG
        }
        //FallBack "Diffuse"
}
 

При условии (i<2)- асьма, 1502 строки, а при (i<50)- 1602--- цикл явно анролица.
Может, оно не работает в сурфейс шейдерах?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 5000
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Шейдер-флуд

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2