Shader LOD

Shadery i tematy z nimi związane.

Shader LOD

Postprzez wojciechp » 06 Kwi 2017, 15:59

Witam, nie dawno rozpocząłem swoją przygodę z shaderami i dziś udało mi się ładny shader z odbiciami otoczenia (rzecz jasna "upieczonymi") jednak chciałbym aby były one renderowane do pewnej odległości od kamery. Być może da się to osiągnąć z użyciem LOD dla shaderów https://docs.unity3d.com/Manual/SL-ShaderLOD.html, jednak rozwiązaniem byłoby również zmierzenie odległości obiektu od kamery. Więc pytanie jak to osiągnąć? Jak napisać kod który wykonał by się raz dla całego modelu? Za odpowiedzi z góry dzięki.

Kod: Zaznacz wszystko
Shader "My/Mobile/Forward reflect shadows"
{
   Properties
   {
      _MainTex ("Texture", 2D) = "white" {}
      _RefForce ("Reflection Force", Range(0,1)) = 0.25
   }
   SubShader
   {
      Tags { "RenderType"="Opaque" }
      LOD 1

      Pass
      {
         Tags{ "LightMode" = "ForwardBase" }

         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         // make fog work
         #pragma multi_compile_fog
         
         #include "UnityCG.cginc"
         #include "Lighting.cginc"
         #include "AutoLight.cginc"
         #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight

         struct appdata
         {
            half4 vertex : POSITION;
            fixed2 uv : TEXCOORD0;
            fixed3 n : NORMAL;
         };

         struct v2f
         {
            fixed2 uv : TEXCOORD0;
            UNITY_FOG_COORDS(1)
            half4 vertex : SV_POSITION;
            SHADOW_COORDS(2)
            fixed col : COLOR;
            fixed ambient : COLOR1;

            half3 refl : TEXCOORD3;
            
         };

         sampler2D _MainTex;
         fixed4 _MainTex_ST;
         fixed _RefForce;
         
         v2f vert (appdata v)
         {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            UNITY_TRANSFER_FOG(o,o.vertex);

            fixed3 normal = UnityObjectToWorldNormal(v.n);
            o.col = max(0, dot(normal, _WorldSpaceLightPos0.xyz));
            o.ambient = ShadeSH9(fixed4(normal, 1));
            TRANSFER_SHADOW(o);

            o.refl = reflect(-UNITY_MATRIX_IT_MV[2].xyz , normal);
            return o;
         }
         
         fixed4 frag (v2f i) : SV_Target
         {
            // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv);
            // sample the reflection cubemap
            fixed4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.refl);
            fixed3 skyColor = DecodeHDR(skyData, unity_SpecCube0_HDR);
            // apply fog
            UNITY_APPLY_FOG(i.fogCoord, col);
            // apply shadows
            col = col * saturate(i.col * SHADOW_ATTENUATION(i) + i.ambient);
            // apply reflections
            col.rgb += skyColor * _RefForce;
            return col;
         }
         ENDCG
      }

      Pass
        {
            Tags {"LightMode"="ShadowCaster"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_shadowcaster
            #include "UnityCG.cginc"

            struct v2f
         {
            V2F_SHADOW_CASTER;
         };

         v2f vert(appdata_base v)
         {
            v2f o;
            TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
            return o;
         }

         fixed4 frag(v2f i) : SV_Target
         {
            return fixed4(0,0,0,0);
         }
            ENDCG
        }
   }
}



PS. Mam wrażenie że odbicia są trochę zbyt mało widoczne ale nie mam pomysłu jak to poprawić...
wojciechp
 
Posty: 11
Rejestracja: 19 Kwi 2016, 11:54
Has thanked: 0 time
Been thanked: 0 time

Wróć do Shader Lab

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 2 gości