CG Shader проверки через if

Шейдеры и все-все-все.

CG Shader проверки через if

Сообщение aler 25 дек 2011, 16:15

Столкнулся с проблемой... В сг шейдере нельзя использовать больше трех проверок if?

Как только открываю больше трех проверок шейдер крашится, хотя до трех все ок (ну почти, так как результат пока не совсем тот что нужно)
Синтаксис:
Используется csharp
Shader "Custom/MultiColorCubeShader"
{
        Properties
        {
                _Color1 ("Code Color 1", Color) = (1,1,0,0)
                _Color2 ("Code Color 2", Color) = (0,0,1,0)
                _Color3 ("Code Color 3", Color) = (1,0,0,0)
               
                _FaceMask1 ("Face 1 Mask", 2D) = "face1" {}
                _FaceMask2 ("Face 2 Mask", 2D) = "face2" {}
                _FaceMask3 ("Face 3 Mask", 2D) = "face3" {}
                _FaceMask4 ("Face 4 Mask", 2D) = "face4" {}
                _FaceMask5 ("Face 5 Mask", 2D) = "face5" {}
                _FaceMask6 ("Face 6 Mask", 2D) = "face6" {}
               
                _FaceCode1 ("Face 1 Code", Float) = 0
                _FaceCode2 ("Face 2 Code", Float) = 0
                _FaceCode3 ("Face 3 Code", Float) = 0
                _FaceCode4 ("Face 4 Code", Float) = 0
                _FaceCode5 ("Face 5 Code", Float) = 0
                _FaceCode6 ("Face 6 Code", Float) = 0
               
                _Color ("Main Color", Color) = (1,1,1,0)
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _BumpMap ("Bump map", 2D) = "bump" {}
        }
       
        SubShader //пиксельный Surface + bump
        {
                Tags { "RenderType"="Opaque" }
                LOD 300
               
                CGPROGRAM
                #pragma surface surf BlinnPhong
               
               
               
                struct Input
                {
                        float2 uv_MainTex;
                        float2 uv_BumpMap;
                };
               
                sampler2D _MainTex,_BumpMap;
                float4 _Color,_Color1,_Color2,_Color3;
                sampler2D _FaceMask1,_FaceMask2,_FaceMask3,_FaceMask4,_FaceMask5,_FaceMask6;
                float _FaceCode1;
                float _FaceCode2;
                float _FaceCode3,_FaceCode4,_FaceCode5,_FaceCode6;
                float _Shininess;
               
                void surf (Input IN, inout SurfaceOutput o)
                {
                        half4 c         = tex2D(_MainTex,   IN.uv_MainTex);
                        half4 face1 = tex2D(_FaceMask1, IN.uv_MainTex);
                        half4 face2 = tex2D(_FaceMask2, IN.uv_MainTex);
                        half4 face3 = tex2D(_FaceMask3, IN.uv_MainTex);
                        half4 face4 = tex2D(_FaceMask4, IN.uv_MainTex);
                        half4 face5 = tex2D(_FaceMask5, IN.uv_MainTex);
                        half4 face6 = tex2D(_FaceMask6, IN.uv_MainTex);
                       
                        c.a = 1-c.a;
                       
                        if (_FaceCode1 == 1) {
                                c.rbg = c.rbg * ( face1.rbg + _Color1.rbg );
                        }
//                      if (_FaceCode1 == 2) {
//                              c.rbg = c.rbg * ( face1.rbg + _Color2.rbg );
//                      }
//                      if (_FaceCode1 == 3) {
//                              c.rbg = c.rbg * ( face1.rbg + _Color3.rbg );
//                      }
//                     
//                     
                        if (_FaceCode2 == 1) {
                                c.rbg = c.rbg * ( face2.rbg + _Color1.rbg );
                        }
//                      if (_FaceCode2 == 2) {
//                              c.rbg = c.rbg * ( face2.rbg + _Color2.rbg );
//                      }
//                      if (_FaceCode2 == 3) {
//                              c.rbg = c.rbg * ( face2.rbg + _Color3.rbg );
//                      }
//                     
//                     
//                      if (_FaceCode3 == 1) {
//                              c.rbg = c.rbg * ( face3.rbg + _Color1.rbg );
//                      }
                        if (_FaceCode3 == 2) {
                                c.rbg = c.rbg * ( face3.rbg + _Color2.rbg );
                        }
//                      if (_FaceCode3 == 3) {
//                              c.rbg = c.rbg * ( face3.rbg + _Color3.rbg );
//                      }
//                     
//                     
//                      if (_FaceCode4 == 1) {
//                              c.rbg = c.rbg * ( face4.rbg + _Color1.rbg );
//                      }
//                      if (_FaceCode4 == 2) {
//                              c.rbg = c.rbg * ( face4.rbg + _Color2.rbg );
//                      }
//                      if (_FaceCode4 == 3) {
//                              c.rbg = c.rbg * ( face4.rbg + _Color3.rbg );
//                      }
//                     
//                     
//                      if (_FaceCode5 == 1) {
//                              c.rbg = c.rbg * ( face5.rbg + _Color1.rbg );
//                      }
//                      if (_FaceCode5 == 2) {
//                              c.rbg = c.rbg * ( face5.rbg + _Color2.rbg );
//                      }
//                      if (_FaceCode5 == 3) {
//                              c.rbg = c.rbg * ( face5.rbg + _Color3.rbg );
//                      }
//                     
//                     
//                      if (_FaceCode6 == 1) {
//                              c.rbg = c.rbg * ( face6.rbg + _Color1.rbg );
//                      }
//                      if (_FaceCode6 == 2) {
//                              c.rbg = c.rbg * ( face6.rbg + _Color2.rbg );
//                      }
//                      if (_FaceCode6 == 3) {
//                              c.rbg = c.rbg * ( face6.rbg + _Color3.rbg );
//                      }
                       
                        o.Albedo = c.rbg * _Color.rbg; //lerp(c.rgb * _Color.rgb,_Color2, c.a );
                        o.Alpha = _Color.a;
                        //o.Gloss = c.a;
                        o.Specular = _Shininess;
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                }
               
                ENDCG
        }  
       
       
       
        SubShader //вертексный шейдер
        {
                Pass
                {
                        Material
                        {
       
                                Diffuse [_Color]
                                Ambient [_Color]
                                Shininess [_Shininess]
                                Specular [_SpecColor]
                                Emission [_Emission]
                        }
                       
                        Lighting On
                        SeparateSpecular On
                       
//                      SetTexture [_MainTex]
//                      {
//                              combine texture lerp (texture) constant
//                              constantColor [_Color2]
//                      }
                       
//                      SetTexture [_MainTex]
//                      {
//                      combine primary * previous double
//                      }
                }
       
        }
       
        FallBack "VertexLit"
}
 
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: CG Shader проверки через if

Сообщение aler 25 дек 2011, 16:21

Попробовал вынести в отдельный метод exam — тоже самое.

Синтаксис:
Используется csharp
                half4 exam (half4 color, float code, half4 mask)
                {
                        if (code == 1) {
                                color.rbg = color.rbg * ( mask.rbg + _Color1.rbg );
                        }
                        if (code == 2) {
                                color.rbg = color.rbg * ( mask.rbg + _Color2.rbg );
                        }
                        if (code == 3) {
                                color.rbg = color.rbg * ( mask.rbg + _Color3.rbg );
                        }
                       
                        return color;
                }
 


Синтаксис:
Используется csharp
                        c = exam(c, _FaceCode1, face1);
                        c = exam(c, _FaceCode2, face2);
                        c = exam(c, _FaceCode3, face3);
                        c = exam(c, _FaceCode4, face4);
                        c = exam(c, _FaceCode5, face5);
                        c = exam(c, _FaceCode6, face6);
 
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: CG Shader проверки через if

Сообщение Battle Angel Alita 25 дек 2011, 17:23

Синтаксис:
Используется glsl
#pragma target 3.0

Но вообще что ты хотел написать? Эдакий сплаттинг? Идея реализована явно через жопу.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: CG Shader проверки через if

Сообщение aler 25 дек 2011, 17:55

Окрашивать часть диффуза в определенный цвет по маске. Уже немного переписал:

Синтаксис:
Используется csharp
                        half4 face1 = tex2D(_FaceMask1, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode1.rgb, c.rbg, face1.a );
                       
                        half4 face2 = tex2D(_FaceMask2, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode2.rgb, c.rbg, face2.a );
                       
                        half4 face3 = tex2D(_FaceMask3, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode3.rgb, c.rbg, face3.a );
                       
                        half4 face4 = tex2D(_FaceMask4, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode4.rgb, c.rbg, face4.a );

                        half4 face5 = tex2D(_FaceMask5, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode5.rgb, c.rbg, face5.a );

                        half4 face6 = tex2D(_FaceMask6, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode6.rgb, c.rbg, face6.a );
 


Работает для Standalone, но мне нужно для iOS, но после 4-го фейса — падает. Есть способ оптимизировать?
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: CG Shader проверки через if

Сообщение aler 25 дек 2011, 18:06

погуглил про сплаттинг, да, именно это :)
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: CG Shader проверки через if

Сообщение Battle Angel Alita 25 дек 2011, 18:25

Синтаксис:
Используется glsl
                        half4 face1234 = tex2D(_FaceMask1234, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode1.rgb, c.rbg, face1234.r );
                        c.rbg = lerp(_FaceCode2.rgb, c.rbg, face1234.g );
                        c.rbg = lerp(_FaceCode3.rgb, c.rbg, face1234.b );
                        c.rbg = lerp(_FaceCode4.rgb, c.rbg, face1234.a );

                        half4 face56 = tex2D(_FaceMask56, IN.uv_MainTex);
                        c.rbg = lerp(_FaceCode5.rgb, c.rbg, face56.r );
                        c.rbg = lerp(_FaceCode6.rgb, c.rbg, face56.g );
 

Как-то так
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: CG Shader проверки через if

Сообщение aler 25 дек 2011, 19:36

Увы, не помогает. Сложность в лерпах, а не обработке текстур :(
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41


Вернуться в Shader Lab

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

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


cron