#pragma multi_compile в шейдерах

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

#pragma multi_compile в шейдерах

Сообщение Receptor 17 июл 2013, 06:34

В общем пытаюсь ознакомиться с кастомизацией инспектра для материалов. Написал шейдер с дерективами:

Синтаксис:
Используется glsl
Shader "Hard Surface Shader" {
Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.1
        _MainTex ("Diffuse", 2D) = "white" {}
        _BumpMap ("Normal", 2D) = "bump" {}
}
SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 250
       
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma multi_compile NORMAL_ON NORMAL_OFF

sampler2D _MainTex;
sampler2D _BumpMap;
fixed4 _Color;
half _Shininess;

struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
};

void surf (Input IN, inout SurfaceOutput o) {
        fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = tex.rgb * _Color.rgb;
        o.Gloss = tex.a;
        o.Alpha = tex.a * _Color.a;
        o.Specular = _Shininess;
        #if NORMAL_ON
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        #endif
}
ENDCG
}

FallBack "Specular"
CustomEditor "HardSurfaceAdvancedEditor"
}

 


При компиляции пишет кучу ошибок в таком духе:
Shader error in 'Hard Surface Shader': D3D shader assembly failed with: (8): error X5204: Read of uninitialized components(*) in r0: *r/x/0 *g/y/1 b/z/2 a/w/3

Shader Assembly: ps_2_0
; 16 ALU, 2 TEX
dcl_2d s0
dcl_2d s1
def c3, 2.00000000, -1.00000000, 1.00000000, 0.00000000
dcl t0.xy
dcl t2.xyz
texld r0, r0, s1
texld r1, t0, s0
mov r0.x, r0.w
mad_pp r2.xy, r0, c3.x, c3.y
mul_pp r0.x, r2.y, r2.y
mad_pp r0.x, -r2, r2, -r0
add_pp r0.x, r0, c3.z
rsq_pp r0.x, r0.x
rcp_pp r2.z, r0.x
dp3_pp r0.x, r2, c0
mul_pp r1, r1, c2
mul_pp r2.xyz, r1, c1
max_pp r0.x, r0, c3.w
mul_pp r0.xyz, r0.x, r2
mul_pp r1.xyz, r1, t2
mov_pp r0.w, r1
mad_pp r0.xyz, r0, c3.x, r1
mov_pp oC0, r0



И такие:

Shader warning in 'Hard Surface Advanced': Program 'frag_surf', variable 'surfIN' used without having been completely initialized (compiling for d3d11) at line 17



При этом, если убрать директивы #if NORMAL_ON и #endif, или вынести вывод нормалки за границы этой дерективы, то все ок работает. Почему такое может быть? Помогите, кто знает, пожалуйста :-??
Последний раз редактировалось Receptor 19 июл 2013, 01:17, всего редактировалось 1 раз.
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение Receptor 17 июл 2013, 09:09

Методом научного тыка понял одну вещь, как я понял такая система, что флаг multi_compile как бы компилит несколько "подпрограмм" (или микропрограмм, я хз как правильно) вместо одной, и по "переключению" директивы подставляет нужный шейдер или эту микропрограмму, но вот c tex2d не работает почему-то... :-\ А жаль... Хотел писать один шейдер, что бы галочками можно было вкл/выкл спекуляр карту, рефлекшн, свечение и т.п... А то по сто штук писать приходится под разные мелочные нужны ~x( Надо добавить какую-то писюшку - копируешь шейдер, дописываешь, компилируешь... Короче надоело :|
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение Receptor 18 июл 2013, 00:37

Совсем-совсем никто не знает даже хоть примерно в какую сторону глядеть? Весь гугл перекопал уже. :)
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 00:46

а разве не

Синтаксис:
Используется glsl
#if defined(NORMAL_ON)
//????
#endif
 
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Ошибка при компиляции шейдера

Сообщение Receptor 18 июл 2013, 00:48

Короче дохлая тема. С горем попалам нашел у западных братьев такую же тему (с такой же проблемой), сначала обрадовался, но оказалось, что и там решения не знают... http://forum.unity3d.com/threads/187817 ... ti_compile

Ладно, обойдемся :(

BornFoRdeatH Ценю Вашу отзывчивость, спасибо большое, но к сожалению, я уже как только не пробовал и чего только не пробовал, все так же.

Я вот думаю, стоит ли отрпавить Багрепорт? Просто сомневаюсь что это баг, скорее кривость рук и не знание структуры шейдеров или чего-то еще.
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 00:51

тогда заведи внешнюю флоат переменную и юзай через if value == 1 :D
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Ошибка при компиляции шейдера

Сообщение Receptor 18 июл 2013, 00:52

А что это даст?
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение aler 18 июл 2013, 01:37

Синтаксис:
Используется csharp
Shader.EnableKeyword("YOUR DEFINITION HERE");
Shader.DisableKeyword("YOUR DEFINITION HERE");
 


Синтаксис:
Используется csharp
#if defined (YOUR DEFINITION HERE)
//do something fancy
#endif
 
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 02:05

aler писал(а):
Синтаксис:
Используется csharp
Shader.EnableKeyword("YOUR DEFINITION HERE");
Shader.DisableKeyword("YOUR DEFINITION HERE");
 


Синтаксис:
Используется csharp
#if defined (YOUR DEFINITION HERE)
//do something fancy
#endif
 


К чему это? сказано же, что работает со всем кроме нормалей

ПС. По ходу глюк компилятора.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Ошибка при компиляции шейдера

Сообщение Receptor 18 июл 2013, 02:10

сказано же, что работает со всем кроме нормалей

Нет, не только с нормалями, а с любыми выходами half3 где надо юзать tex2D или UnpackNormal, следующее работает как надо: o.Gloss, o.Shininnes, o.Alpha. Не работают: o.Albedo, o.Normal, o.Emission. Т.е. именно когда дело касается 2д текстур... почему-то... Вообще ничего не понимаю, с чем это может быть связанно. А в примере не сказанно ничего http://docs.unity3d.com/Documentation/C ... itors.html


aler Тоже попробовал.

Синтаксис:
Используется csharp
Shader "Pizdec Suka Shader Dohuya" {
        Properties {
                _MainTex ("Diffuse Map", 2D) = "white" {}
                _EmissionMap ("Emission Map", 2D) = "white" {}
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf BlinnPhong
                #define ON
               
                sampler2D _MainTex;
               
                #if defined (ON)
                sampler2D _EmissionMap;
                #endif
               
                struct Input {
                        float2 uv_MainTex;
                        float2 uv_EmissionMap;
                };

                void surf (Input IN, inout SurfaceOutput o) {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                        #if defined (ON)
                        o.Emission = tex2D (_EmissionMap, IN.uv_EmissionMap);
                        #endif
                }
                ENDCG
        }
        FallBack "Diffuse"
        CustomEditor "ZaebaloBlyat"
}

 


Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class ZaebaloBlyat : MaterialEditor {
       
        public override void OnInspectorGUI (){
               
                base.OnInspectorGUI();
               
                Material m = target as Material;
               
                if(GUILayout.Button("On")){
                        Shader.EnableKeyword("ON");
                }
                if(GUILayout.Button("Off")){
                        Shader.DisableKeyword("ON");
                }

        }
}

 


Никакой реакции.
Последний раз редактировалось Receptor 18 июл 2013, 02:13, всего редактировалось 1 раз.
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 02:12

альбедо отлично работает. остальное не проверял.


:))

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

//Так работает
                #if NORMAL_ON
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                #else
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                #endif

//Так не работает
                #if NORMAL_ON
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                #else
                        o.Normal = UnpackNormal(tex2D(_MainTex, IN.uv_MainTex));
                #endif
 
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 03:23

Глючная ботва, как хорошо что я отказался от сюрфейс шейдеров.

дальше этого продвинуться терпения не хватило

Синтаксис:
Используется glsl
                o.Normal = fixed3(1,1,1);
                #if defined(NORMAL_ON)
                        fixed3 normal = o.Normal;
                        fixed4 packednormal = tex2D(_BumpMap, IN.uv_BumpMap);
                        //normal.xy = packednormal.wy * 2 - 1;
                        //normal.z = sqrt(1 - normal.x * normal.x - normal.y * normal.y);
                        o.Normal = normal;
                #endif
 
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Ошибка при компиляции шейдера

Сообщение Receptor 18 июл 2013, 06:19

Глючная ботва, как хорошо что я отказался от сюрфейс шейдеров.

Фрагментные делаете? Или как их там... Кстати, вот если писать шейдер с методом #pragma frag, то там директивы эти хорошо работают, но я не умею такие шейдеры писать. Пример бы простой, Diffuse Bump хотя бы :)

По поводу кода, я так пробовал тоже, записываешь нормалю в фефолтную(типа), потом если директива, то o.Normal += blablabla, но я так и не понял, как присвоить o.Normal дефолтное значение, ибо (1,1,1) это нито совсем
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Ошибка при компиляции шейдера

Сообщение jetyb 18 июл 2013, 07:42

а)Добавьте
#pragma target 3.0

б)
Синтаксис:
Используется csharp
struct Input
{
        float2 uv_MainTex;
        float2 uv_BumpMap;
        float3 worldNormal;
        INTERNAL_DATA
};

#if NORMAL_ON
        o.Normal = WorldNormalVector (IN, o.Normal);
#endif
 
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Ошибка при компиляции шейдера

Сообщение BornFoRdeatH 18 июл 2013, 11:37

Receptor писал(а):
Глючная ботва, как хорошо что я отказался от сюрфейс шейдеров.

Фрагментные делаете? Или как их там... Кстати, вот если писать шейдер с методом #pragma frag, то там директивы эти хорошо работают, но я не умею такие шейдеры писать. Пример бы простой, Diffuse Bump хотя бы :)

По поводу кода, я так пробовал тоже, записываешь нормалю в фефолтную(типа), потом если директива, то o.Normal += blablabla, но я так и не понял, как присвоить o.Normal дефолтное значение, ибо (1,1,1) это нито совсем


Фрагменты, фрагменты...

Вот отличный пример, с освещением и прочими полезностями, остальное легко добавляется-изменяется.

Синтаксис:
Используется glsl
Shader "Custom/NewShader Manual" {

    Properties {

        _MainTex ("Base (RGB)", 2D) = "white" {}

    }

    SubShader {

        Tags { "RenderType"="Opaque" }

        LOD 200

        Pass {

            //ForwardBase pass lighting:

            //

            // 1 lightmap

            // 1 directional pixel light

            //

            //OR

            //

            // 1 directional pixel light

            // 9 spherical harmonic coefficients

            // (optionally) 4 point vertex lights

            Name "FORWARD"

            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM

            #pragma vertex vert_surf

            #pragma fragment frag_surf

            #pragma fragmentoption ARB_precision_hint_fastest

            #pragma multi_compile_fwdbase

            #include "HLSLSupport.cginc"

            #define UNITY_PASS_FORWARDBASE

            #include "UnityCG.cginc"

            #include "Lighting.cginc"

            #include "AutoLight.cginc"

 

            sampler2D _MainTex;

 

            #ifdef LIGHTMAP_OFF

            struct v2f_surf {

                float4 pos : SV_POSITION;

                float2 pack0 : TEXCOORD0;

                fixed3 normal : TEXCOORD1;

                fixed3 vlight : TEXCOORD2; //vertex + SH lighting results

                LIGHTING_COORDS(3,4)

            };

            #endif

            #ifndef LIGHTMAP_OFF

            struct v2f_surf {

                float4 pos : SV_POSITION;

                float2 pack0 : TEXCOORD0;

                float2 lmap : TEXCOORD1;

                LIGHTING_COORDS(2,3)

            };

            #endif

            #ifndef LIGHTMAP_OFF

            float4 unity_LightmapST;

            float4 unity_ShadowFadeCenterAndType;

            #endif

            float4 _MainTex_ST;

            v2f_surf vert_surf (appdata_full v) {

                v2f_surf o;

                // Transform vertex into normalized device coordinates

                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

                // Apply scaling/tiling to UV coordinates

                o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);

                #ifndef LIGHTMAP_OFF

                // Apply scaling/tiling to UV2 coordinates for light map

                o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;

                #endif

                // Calculate world normal

                float3 worldN = mul((float3x3)_Object2World, SCALED_NORMAL);

                #ifdef LIGHTMAP_OFF

                o.normal = worldN;

                #endif

                #ifdef LIGHTMAP_OFF

                // Spherical harmonic contribution

                float3 shlight = ShadeSH9 (float4(worldN,1.0));

                o.vlight = shlight;

                #ifdef VERTEXLIGHT_ON

                float3 worldPos = mul(_Object2World, v.vertex).xyz;

                // Vertex light contribution

                o.vlight += Shade4PointLights (

                    unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,

                    unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,

                    unity_4LightAtten0, worldPos, worldN );

                #endif // VERTEXLIGHT_ON

                #endif // LIGHTMAP_OFF

                // Shadow coordinates

                TRANSFER_VERTEX_TO_FRAGMENT(o);

                return o;

            }

            #ifndef LIGHTMAP_OFF

            sampler2D unity_Lightmap;

            #endif

            fixed4 frag_surf (v2f_surf IN) : COLOR {

                // Surface setup

                SurfaceOutput o;

                o.Albedo = 0.0;

                o.Emission = 0.0;

                o.Specular = 0.0;

                o.Alpha = 0.0;

                o.Gloss = 0.0;

                #ifdef LIGHTMAP_OFF

                o.Normal = IN.normal;

                #endif

                // Surface function normally be called here

                half4 tex = tex2D (_MainTex, IN.pack0.xy);

                o.Albedo = tex.rgb;

                o.Alpha = tex.a;

                fixed atten = LIGHT_ATTENUATION(IN);

                fixed4 c = 0;

                #ifdef LIGHTMAP_OFF

                // Directional light

                c = LightingLambert (o, _WorldSpaceLightPos0.xyz, atten);

                #endif // LIGHTMAP_OFF

                #ifdef LIGHTMAP_OFF

                // Vertex and SH light

                c.rgb += o.Albedo * IN.vlight;

                #endif // LIGHTMAP_OFF

                #ifndef LIGHTMAP_OFF

                // Light map

                fixed4 lmtex = tex2D(unity_Lightmap, IN.lmap.xy);

                fixed3 lm = DecodeLightmap (lmtex);

                #ifdef SHADOWS_SCREEN

                #if defined(SHADER_API_GLES) && defined(SHADER_API_MOBILE)

                c.rgb += o.Albedo * min(lm, atten*2);

                #else

                c.rgb += o.Albedo * max(min(lm,(atten*2)*lmtex.rgb), lm*atten);

                #endif

                #else // SHADOWS_SCREEN

                c.rgb += o.Albedo * lm;

                #endif // SHADOWS_SCREEN

                c.a = o.Alpha;

            #endif // LIGHTMAP_OFF

                return c;

            }

 

            ENDCG

        }

        Pass {

            //ForwardAdd pass lighting:

            //

            // 1 additional pixel light

            Name "FORWARD"

            Tags { "LightMode" = "ForwardAdd" }

            ZWrite Off Blend One One Fog { Color (0,0,0,0) }

            CGPROGRAM

            #pragma vertex vert_surf

            #pragma fragment frag_surf

            #pragma fragmentoption ARB_precision_hint_fastest

            #pragma multi_compile_fwdadd

            #include "HLSLSupport.cginc"

            #define UNITY_PASS_FORWARDADD

            #include "UnityCG.cginc"

            #include "Lighting.cginc"

            #include "AutoLight.cginc"

           

            sampler2D _MainTex;

           

            struct v2f_surf {

                float4 pos : SV_POSITION;

                float2 pack0 : TEXCOORD0;

                fixed3 normal : TEXCOORD1;

                half3 lightDir : TEXCOORD2;

                LIGHTING_COORDS(3,4)

            };

            float4 _MainTex_ST;

            v2f_surf vert_surf (appdata_full v) {

                v2f_surf o;

                // Transform vertex into normalized device coordinates

                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

                // Apply scaling/tiling to UV coordinates

                o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);

                // Calculate world normal

                o.normal = mul((float3x3)_Object2World, SCALED_NORMAL);

                // World light direction calculation depends on light type

                float3 lightDir = WorldSpaceLightDir( v.vertex );

                o.lightDir = lightDir;

                // Shadow coordinates

                TRANSFER_VERTEX_TO_FRAGMENT(o);

                return o;

            }

            fixed4 frag_surf (v2f_surf IN) : COLOR {

                // Surface setup

                SurfaceOutput o;

                o.Albedo = 0.0;

                o.Emission = 0.0;

                o.Specular = 0.0;

                o.Alpha = 0.0;

                o.Gloss = 0.0;

                o.Normal = IN.normal;

                // Surface function normally be called here

                half4 tex = tex2D (_MainTex, IN.pack0.xy);

                o.Albedo = tex.rgb;

                o.Alpha = tex.a;

                #ifndef USING_DIRECTIONAL_LIGHT

                fixed3 lightDir = normalize(IN.lightDir);

                #else

                fixed3 lightDir = IN.lightDir;

                #endif

                // Apply lighting

                fixed4 c = LightingLambert (o, lightDir, LIGHT_ATTENUATION(IN));

                c.a = 0.0;

                return c;

            }

           

            ENDCG

        }

        Pass {

            //PrePassBase:

            //

            // Packs world normal into RGB

            // Specular power into A

            Name "PREPASS"

            Tags { "LightMode" = "PrePassBase" }

            Fog {Mode Off}

            CGPROGRAM

            #pragma vertex vert_surf

            #pragma fragment frag_surf

            #pragma fragmentoption ARB_precision_hint_fastest

           

            #include "HLSLSupport.cginc"

            #define UNITY_PASS_PREPASSBASE

            #include "UnityCG.cginc"

            #include "Lighting.cginc"

           

            struct v2f_surf {

                float4 pos : SV_POSITION;

                fixed3 normal : TEXCOORD0;

            };

            v2f_surf vert_surf (appdata_full v) {

                v2f_surf o;

                // Transform vertex into normalized device coordinates

                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

                // Calculate world normal

                o.normal = mul((float3x3)_Object2World, SCALED_NORMAL);

                return o;

            }

            fixed4 frag_surf (v2f_surf IN) : COLOR {

                SurfaceOutput o;

                o.Albedo = 0.0;

                o.Emission = 0.0;

                o.Specular = 0.0;

                o.Alpha = 0.0;

                o.Gloss = 0.0;

                o.Normal = IN.normal;

                // Surface function normally be called here

                fixed4 res;

                // Pack normal

                res.rgb = o.Normal * 0.5 + 0.5;

                // Specular goes in alpha channel

                res.a = o.Specular;

                return res;

            }

           

            ENDCG

        }

        Pass {

            //PrePassFinal pass lighting:

            //

            // 2 light maps

            // Any number of pixel lights

            Name "PREPASS"

            Tags { "LightMode" = "PrePassFinal" }

            ZWrite Off

            CGPROGRAM

            #pragma vertex vert_surf

            #pragma fragment frag_surf

            #pragma fragmentoption ARB_precision_hint_fastest

            #pragma multi_compile_prepassfinal

            #include "HLSLSupport.cginc"

            #define UNITY_PASS_PREPASSFINAL

            #include "UnityCG.cginc"

            #include "Lighting.cginc"

           

            sampler2D _MainTex;

           

            struct v2f_surf {

                float4 pos : SV_POSITION;

                float2 pack0 : TEXCOORD0;

                float4 screen : TEXCOORD1;

            #ifndef LIGHTMAP_OFF

                float2 lmap : TEXCOORD2;

                float4 lmapFadePos : TEXCOORD3;

            #endif

            };

            #ifndef LIGHTMAP_OFF

            float4 unity_LightmapST;

            float4 unity_ShadowFadeCenterAndType;

            #endif

            float4 _MainTex_ST;

            v2f_surf vert_surf (appdata_full v) {

                v2f_surf o;

                // Transform vertex into normalized device coordinates

                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

                // Apply scaling/tiling to UV coordinates

                o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);

                // Screen coordinates from position

                o.screen = ComputeScreenPos (o.pos);

            #ifndef LIGHTMAP_OFF

                // Apply scaling/tiling to UV2 coordinates for light map

                o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;

                // Dual lightmap fading factors

                o.lmapFadePos.xyz = (mul(_Object2World, v.vertex).xyz - unity_ShadowFadeCenterAndType.xyz) * unity_ShadowFadeCenterAndType.w;

                o.lmapFadePos.w = (-mul(UNITY_MATRIX_MV, v.vertex).z) * (1.0 - unity_ShadowFadeCenterAndType.w);

            #endif

                return o;

            }

            sampler2D _LightBuffer;

            #ifndef LIGHTMAP_OFF

            sampler2D unity_Lightmap;

            sampler2D unity_LightmapInd;

            float4 unity_LightmapFade;

            #endif

            fixed4 unity_Ambient;

            fixed4 frag_surf (v2f_surf IN) : COLOR {

                // Set up surface

                SurfaceOutput o;

                o.Albedo = 0.0;

                o.Emission = 0.0;

                o.Specular = 0.0;

                o.Alpha = 0.0;

                o.Gloss = 0.0;

                // Surface function normally be called here

                half4 tex = tex2D (_MainTex, IN.pack0.xy);

                o.Albedo = tex.rgb;

                o.Alpha = tex.a;

                // Sample light buffer

                half4 light = tex2Dproj (_LightBuffer, UNITY_PROJ_COORD(IN.screen));

            #if defined (SHADER_API_GLES)

                light = max(light, half4(0.001));

            #endif

                // Light buffer values are encoded logarithmically

                light = -log2(light);

            #ifndef LIGHTMAP_OFF

                // Sample both light maps and interpolate between them

                half3 lmFull = DecodeLightmap (tex2D(unity_Lightmap, IN.lmap.xy));

                half3 lmIndirect = DecodeLightmap (tex2D(unity_LightmapInd, IN.lmap.xy));

                float lmFade = length (IN.lmapFadePos) * unity_LightmapFade.z + unity_LightmapFade.w;

                half3 lm = lerp (lmIndirect, lmFull, saturate(lmFade));

                light.rgb += lm;

            #else

                // Ambient light only if there is no light map

                light.rgb += unity_Ambient.rgb;

            #endif

                // Apply light buffer to material

                half4 col = LightingLambert_PrePass (o, light);

                return col;

            }

            ENDCG

        }   // Pass to render object as a shadow caster

        Pass {

            Name "ShadowCaster"

            Tags { "LightMode" = "ShadowCaster" }

       

            Fog {Mode Off}

            ZWrite On ZTest Less Cull Off

            Offset 1, 1

 

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #pragma multi_compile_shadowcaster

            #pragma fragmentoption ARB_precision_hint_fastest

            #include "UnityCG.cginc"

 

            struct v2f {

                V2F_SHADOW_CASTER;

            };

 

            v2f vert( appdata_base v )

            {

                v2f o;

                TRANSFER_SHADOW_CASTER(o)

                return o;

            }

 

            float4 frag( v2f i ) : COLOR

            {

                SHADOW_CASTER_FRAGMENT(i)

            }

            ENDCG

 

        }

   

        // Pass to render object as a shadow collector

        Pass {

            Name "ShadowCollector"

            Tags { "LightMode" = "ShadowCollector" }

       

            Fog {Mode Off}

            ZWrite On ZTest Less

 

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #pragma fragmentoption ARB_precision_hint_fastest

            #pragma multi_compile_shadowcollector

 

            #define SHADOW_COLLECTOR_PASS

            #include "UnityCG.cginc"

 

            struct appdata {

                float4 vertex : POSITION;

            };

 

            struct v2f {

                V2F_SHADOW_COLLECTOR;

            };

 

            v2f vert (appdata v)

            {

                v2f o;

                TRANSFER_SHADOW_COLLECTOR(o)

                return o;

            }

 

            fixed4 frag (v2f i) : COLOR

            {

                SHADOW_COLLECTOR_FRAGMENT(i)

            }

            ENDCG

 

        }

    }

}
 


ПС. это вроде дефолтный сто старой юньки когда сюрфейсов еще небыло, я его себе в шаблоны кинул :)
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

След.

Вернуться в Почемучка

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

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