Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

How to transform a Unity .shader into a custom node in Shader Graph?

Discussion in 'Shaders' started by pmoraes, Aug 17, 2021.

  1. pmoraes

    pmoraes

    Joined:
    Apr 6, 2016
    Posts:
    6
    I want to use a .shader file as a custom node in my Shader Graph: I want to be able to stretch into the horizon any input (texture or any other effect from Shader Graph)

    Code (CSharp):
    1. Shader "Custom/OceanHorizon"
    2.     {
    3.         Properties
    4.         {
    5.             _MainTex ("Texture", 2D) = "white" {}
    6.             _FogColor("fog color", Color) = (1,1,1,1)
    7.             _FogBlend ("fog blend", Range (0.01,2.0)) = .1
    8.            
    9.         }
    10.         SubShader
    11.         {
    12.             Tags { "RenderType"="Opaque" }
    13.             LOD 100
    14.    
    15.             Pass
    16.             {
    17.                 CGPROGRAM
    18.                 #pragma vertex vert
    19.                 #pragma fragment frag
    20.                 // make fog work
    21.                 #pragma multi_compile_fog
    22.                
    23.                 #include "UnityCG.cginc"
    24.    
    25.                 struct appdata
    26.                 {
    27.                     float4 vertex : POSITION;
    28.                     float2 uv : TEXCOORD0;
    29.                 };
    30.    
    31.                 struct v2f
    32.                 {
    33.                     float2 uv : TEXCOORD0;
    34.                     UNITY_FOG_COORDS(1)
    35.                     float4 vertex : SV_POSITION;
    36.                     float3 worldPos : TEXCOORD1;
    37.                 };
    38.    
    39.                 sampler2D _MainTex;
    40.                 float4 _MainTex_ST;
    41.                 float4 _Color;
    42.                 float4 _FogColor;
    43.                
    44.                 float _FogBlend;
    45.                
    46.                 v2f vert (appdata v)
    47.                 {
    48.                     v2f o;
    49.                     o.vertex = UnityObjectToClipPos(v.vertex);
    50.                     o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    51.                     UNITY_TRANSFER_FOG(o,o.vertex);
    52.                     o.worldPos = mul (unity_ObjectToWorld, v.vertex);
    53.                     return o;
    54.                 }
    55.                
    56.                
    57.                 fixed4 frag (v2f i) : SV_Target
    58.                 {
    59.                     float3 cdir =i.worldPos;
    60.                     float3 cpos = _WorldSpaceCameraPos;  
    61.                     cdir.y -= cpos.y;
    62.                    
    63.                     float3 oceanUpDir = float3(0.0, 1.0, 0.0);
    64.                     float dist = -dot(cpos, oceanUpDir) / dot(cdir, oceanUpDir);
    65.                     float3 pos = cpos + dist * cdir;
    66.        
    67.                     float3 pix;
    68.                     if(dist > 0.0 && dist < 100.0) {
    69.                    
    70.                      // add you Ocean here use pos.xz instead of uv
    71.                         float3 wat = tex2D(_MainTex, pos.xz *.1);
    72.                        
    73.                         pix = lerp(wat, _FogColor, min(dist * _FogBlend, 1.0));
    74.                     } else {
    75.                         // Sky
    76.                         discard;
    77.                         //pix =  lerp(float3(1,1,1), _Color, min(cdir.y * 4.0, 1.0));
    78.                     }
    79.                
    80.                     return float4(pix ,1 );
    81.                 }
    82.                 ENDCG
    83.             }
    84.         }
    85.     }
    86.