Search Unity

TRANSFER_SHADOW and TRANSFER_SHADOW_CASTER_NORMALOFFSET in same cginc file results in error

Discussion in 'Shaders' started by Isomania, Jul 4, 2022.

  1. Isomania

    Isomania

    Joined:
    Jan 28, 2021
    Posts:
    16
    Hi!

    I have a cginc file (GeoSnap.cginc) set up to have multiple vertex functions like vert, vertSnap, vertShadow, vertShadowSnap, vertNormal, vertNormalSnap etc. The idea is that I could include this file in my shader and specify which vertex shader I wish to use by writing "#pragma vertex vert" or "#pragma vertex vertShadow" etc in my shader.

    However when I try to do that I get the error:
    Code (CSharp):
    1. Shader error in 'Custom/Toon Shader Snap': unrecognized identifier 'SHADOW_COORDS' at Assets/Graphics/CGincFiles/Geometry/GeoSetup.cginc(21) (on d3d11)
    Only for my shadows pass however, my normal pass compiles and workes as expected.

    I guess my question is, what even is SHADOW_COORDS, V2F_SHADOW_CASTER, TRANSFER_SHADOW and TRANSFER_SHADOW_CASTER_NORMALOFFSET? They do not seem to work like normal functions given that they do not require a semicolon, nor variables since they are followed by opened and closed brackets.

    Given that neither vert nor vertSnap is used for my custom ShadowCaster pass, only included, v2f should never be created, and therefore the compiler should not get mad about the SHADOW_COORDS(3) in v2f.

    If I seperate vert from shadow from normal, the shader compiles... However I do not want to change the include file, only the #pragma vertex.

    GeoSetup.cginc:
    Code (CSharp):
    1. struct appdata
    2. {
    3.     float4 vertex : POSITION;              
    4.     float4 uv : TEXCOORD0;
    5.     float3 normal : NORMAL;
    6.     float3 worldPosition : TEXCOORD1;
    7.     float4 screenPosition : TEXCOORD3;
    8. };
    9.  
    10. // For Geometry
    11. struct v2f
    12. {
    13.     float4 pos : SV_POSITION;
    14.     float3 worldNormal : NORMAL;
    15.     float2 uv : TEXCOORD0;
    16.     float3 worldPosition : TEXCOORD1;
    17.     float4 screenPosition : TEXCOORD2;
    18.     // Macro found in Autolight.cginc. Declares a vector4
    19.     // into the TEXCOORD3 semantic with varying precision
    20.     // depending on platform target.
    21.     SHADOW_COORDS(3)
    22. };
    23.  
    24. // For Shadows
    25. struct v2f_shadow
    26. {
    27.     V2F_SHADOW_CASTER;
    28. };
    29.  
    30. // For Normal Replacement Shader
    31. struct v2f_normal
    32. {
    33.     float4 pos : SV_POSITION;
    34.     float3 viewNormal : NORMAL;
    35. };
    Geo.cginc:
    Code (CSharp):
    1. #include "/Assets/Graphics/CGincFiles/Geometry/GeoSetup.cginc"
    2.  
    3. v2f vert(appdata v)
    4. {
    5.     v2f o;
    6.     o.pos = UnityObjectToClipPos(v.vertex);
    7.     o.worldNormal = UnityObjectToWorldNormal(v.normal);
    8.     o.worldPosition = mul(unity_ObjectToWorld, v.vertex);
    9.     o.screenPosition = ComputeScreenPos(o.pos);
    10.     o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    11.     // Defined in Autolight.cginc. Assigns the above shadow coordinate
    12.     // by transforming the vertex from world space to shadow-map space.
    13.     TRANSFER_SHADOW(o)
    14.     return o;
    15. }
    16. v2f_shadow vertShadow(appdata v)
    17. {
    18.     v2f_shadow o;
    19.     TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
    20.     return o;
    21. }
    22.  
    23. v2f_normal vertNormal(appdata v)
    24. {
    25.     v2f_normal o;
    26.     o.pos = UnityObjectToClipPos(v.vertex);
    27.     o.viewNormal = COMPUTE_VIEW_NORMAL;
    28.     return o;
    29. }
    GeoSnap:
    Code (CSharp):
    1. #include "/Assets/Graphics/CGincFiles/Geometry/Geo.cginc"
    2. #include "/Assets/Graphics/CGincFiles/Geometry/SnapSetup.cginc"
    3.  
    4. v2f vertSnap (appdata v)
    5. {
    6.     if (unity_OrthoParams.w == 0.0)
    7.     {
    8.         return vert(v);
    9.     }
    10.  
    11.     // create v2f
    12.     v2f o;
    13.  
    14.     // get vertex object snapped difference
    15.     float4 m_vertexClipSnappedDiff = MainCameraClipSnappedDifference();
    16.     float4 vertexWorldSnappedDiff = SnappedDifferenceWorld(m_vertexClipSnappedDiff);
    17.     float4 vertexObjectSnappedDiff = SnappedDifferenceObject(vertexWorldSnappedDiff);
    18.  
    19.     // snap current vertex
    20.     v.vertex += vertexObjectSnappedDiff;
    21.  
    22.     // get vertex world using now clipped vertex
    23.     o.worldPosition = mul(unity_ObjectToWorld, v.vertex);
    24.     // get vertex clip
    25.     o.pos = UnityObjectToClipPos(v.vertex);
    26.  
    27.     // when you know how to snap rotation, worldnormal need to be accounted for! (https://forum.unity.com/threads/cancel-object-inspector-rotation-from-shader-but-keep-movement.758972/)
    28.  
    29.     o.worldNormal = UnityObjectToWorldNormal(v.normal);
    30.     o.screenPosition = ComputeScreenPos(o.pos);
    31.     o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    32.  
    33.     // Defined in Autolight.cginc. Assigns the above shadow coordinate
    34.     // by transforming the vertex from world space to shadow-map space.
    35.     TRANSFER_SHADOW(o)
    36.  
    37.     //o.worldPosition = objectOriginWorld.xyz;
    38.  
    39.     return o;
    40. }
    41.  
    42. v2f_shadow vertShadowSnap (appdata v)
    43. {
    44.     if (unity_OrthoParams.w == 0.0)
    45.     {
    46.         return vertShadow(v);
    47.     }
    48.  
    49.     // create v2f_shadow
    50.     v2f_shadow o;
    51.  
    52.     // get vertex object snapped difference
    53.     float4 m_vertexClipSnappedDiff = MainCameraClipSnappedDifference();
    54.     float4 vertexWorldSnappedDiff = SnappedDifferenceWorld(m_vertexClipSnappedDiff);
    55.     float4 vertexObjectSnappedDiff = SnappedDifferenceObject(vertexWorldSnappedDiff);
    56.  
    57.     // snap current vertex
    58.     v.vertex += vertexObjectSnappedDiff;
    59.  
    60.     // get vertex clip
    61.     o.pos = UnityObjectToClipPos(v.vertex);
    62.  
    63.     // Defined in Autolight.cginc.
    64.     TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
    65.  
    66.     return o;
    67. }
    68.  
    69. v2f_normal vertNormalSnap (appdata v)
    70. {
    71.     if (unity_OrthoParams.w == 0.0)
    72.     {
    73.         return vertNormal(v);
    74.     }
    75.  
    76.     // create v2f_normal
    77.     v2f_normal o;
    78.  
    79.     // get vertex object snapped difference
    80.     float4 m_vertexClipSnappedDiff = MainCameraClipSnappedDifference();
    81.     float4 vertexWorldSnappedDiff = SnappedDifferenceWorld(m_vertexClipSnappedDiff);
    82.     float4 vertexObjectSnappedDiff = SnappedDifferenceObject(vertexWorldSnappedDiff);
    83.  
    84.     // snap current vertex
    85.     v.vertex += vertexObjectSnappedDiff;
    86.  
    87.     // get vertex clip
    88.     o.pos = UnityObjectToClipPos(v.vertex);
    89.  
    90.     o.viewNormal = COMPUTE_VIEW_NORMAL;
    91.  
    92.     // Defined in Autolight.cginc.
    93.     TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
    94.  
    95.     return o;
    96. }