WorldNormal.shader 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Author: Jason Ederle
  2. // Description: Render out the world space normal of an object encoded between 0-1 value ranges.
  3. Shader "Funly/Sky Studio/Utility/World Normal"
  4. {
  5. Properties
  6. {
  7. [HideInInspector] _MainTex("Texture", 2D) = "white" {}
  8. }
  9. SubShader
  10. {
  11. Tags{"RenderType" = "Opaque"} LOD 100
  12. Pass
  13. {
  14. CGPROGRAM
  15. #pragma target 2.0
  16. #pragma vertex vert
  17. #pragma fragment frag
  18. #include "UnityCG.cginc"
  19. struct appdata
  20. {
  21. float4 vertex : POSITION;
  22. float4 normal : NORMAL;
  23. };
  24. struct v2f
  25. {
  26. float4 vertex : SV_POSITION;
  27. float4 normal : NORMAL; // FIXME - Is this correct here?
  28. };
  29. float4x4 inverse(float4x4 input)
  30. {
  31. #define minor(a, b, c) determinant(float3x3(input.a, input.b, input.c))
  32. float4x4 cofactors = float4x4(
  33. minor(_22_23_24, _32_33_34, _42_43_44),
  34. -minor(_21_23_24, _31_33_34, _41_43_44),
  35. minor(_21_22_24, _31_32_34, _41_42_44),
  36. -minor(_21_22_23, _31_32_33, _41_42_43),
  37. -minor(_12_13_14, _32_33_34, _42_43_44),
  38. minor(_11_13_14, _31_33_34, _41_43_44),
  39. -minor(_11_12_14, _31_32_34, _41_42_44),
  40. minor(_11_12_13, _31_32_33, _41_42_43),
  41. minor(_12_13_14, _22_23_24, _42_43_44),
  42. -minor(_11_13_14, _21_23_24, _41_43_44),
  43. minor(_11_12_14, _21_22_24, _41_42_44),
  44. -minor(_11_12_13, _21_22_23, _41_42_43),
  45. -minor(_12_13_14, _22_23_24, _32_33_34),
  46. minor(_11_13_14, _21_23_24, _31_33_34),
  47. -minor(_11_12_14, _21_22_24, _31_32_34),
  48. minor(_11_12_13, _21_22_23, _31_32_33));
  49. #undef minor
  50. return transpose(cofactors) / determinant(input);
  51. }
  52. v2f vert(appdata v)
  53. {
  54. v2f o;
  55. o.vertex = UnityObjectToClipPos(v.vertex);
  56. //float3 scaledNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));
  57. //float3 scaledNormal = v.normal.xyz;
  58. //float3 worldNormal = mul(unity_ObjectToWorld, float4(scaledNormal, 0));
  59. // Correct normal for scaling.
  60. float3 worldNormal = mul(transpose(inverse(unity_ObjectToWorld)), float4(v.normal.xyz, 0.0f)).xyz;
  61. worldNormal = normalize(worldNormal);
  62. o.normal = float4(worldNormal, 1.0f);
  63. return o;
  64. }
  65. fixed4 frag(v2f i) : SV_Target
  66. {
  67. fixed3 normalPercent = (i.normal.xyz + 1.0) / 2.0f;
  68. return fixed4(normalPercent, 1.0f);
  69. }
  70. ENDCG
  71. }
  72. }
  73. }