Preview.cginc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #ifndef PREVIEW_INCLUDED
  2. #define PREVIEW_INCLUDED
  3. #include "UnityCG.cginc"
  4. float3 preview_WorldSpaceCameraPos;
  5. float4x4 preview_WorldToObject;
  6. float4x4 preview_ObjectToWorld;
  7. float4x4 preview_MatrixV;
  8. float4x4 preview_MatrixInvV;
  9. inline float3 PreviewFragmentPositionOS( float2 uv )
  10. {
  11. float2 xy = 2 * uv - 1;
  12. float z = -sqrt( 1 - saturate( dot( xy, xy ) ) );
  13. return float3( xy, z );
  14. }
  15. inline float3 PreviewFragmentNormalOS( float2 uv, bool normalized = true )
  16. {
  17. float3 positionOS = PreviewFragmentPositionOS( uv );
  18. float3 normalOS = positionOS;
  19. if ( normalized )
  20. {
  21. normalOS = normalize( normalOS );
  22. }
  23. return normalOS;
  24. }
  25. inline float3 PreviewFragmentTangentOS( float2 uv, bool normalized = true )
  26. {
  27. float3 positionOS = PreviewFragmentPositionOS( uv );
  28. float3 tangentOS = float3( -positionOS.z, positionOS.y * 0.01, positionOS.x );
  29. if ( normalized )
  30. {
  31. tangentOS = normalize( tangentOS );
  32. }
  33. return tangentOS;
  34. }
  35. inline float3 PreviewWorldSpaceViewDir( in float3 worldPos, bool normalized )
  36. {
  37. float3 vec = preview_WorldSpaceCameraPos.xyz - worldPos;
  38. if ( normalized )
  39. {
  40. vec = normalize( vec );
  41. }
  42. return vec;
  43. }
  44. inline float3 PreviewWorldToObjectDir( in float3 dir, const bool normalized )
  45. {
  46. float3 vec = mul( ( float3x3 )preview_WorldToObject, dir );
  47. if ( normalized )
  48. {
  49. vec = normalize( vec );
  50. }
  51. return vec;
  52. }
  53. inline float3 PreviewObjectToWorldDir( in float3 dir, const bool normalized )
  54. {
  55. float3 vec = mul( ( float3x3 )preview_ObjectToWorld, dir );
  56. if ( normalized )
  57. {
  58. vec = normalize( vec );
  59. }
  60. return vec;
  61. }
  62. inline float3 PreviewWorldToViewDir( in float3 dir, const bool normalized )
  63. {
  64. float3 vec = mul( ( float3x3 )preview_MatrixV, dir );
  65. if ( normalized )
  66. {
  67. vec = normalize( vec );
  68. }
  69. return vec;
  70. }
  71. inline float3 PreviewViewToWorldDir( in float3 dir, const bool normalized )
  72. {
  73. float3 vec = mul( ( float3x3 )preview_MatrixInvV, dir );
  74. if ( normalized )
  75. {
  76. vec = normalize( vec );
  77. }
  78. return vec;
  79. }
  80. float3 PreviewFragmentTangentToWorldDir( in float2 uv, in float3 normalTS, const bool normalized )
  81. {
  82. float3 vertexPos = PreviewFragmentPositionOS( uv );
  83. float3 tangent = PreviewFragmentTangentOS( uv );
  84. float3 worldPos = mul( unity_ObjectToWorld, float4( vertexPos, 1 ) ).xyz;
  85. float3 normal = PreviewFragmentNormalOS( uv );
  86. float3 worldNormal = UnityObjectToWorldNormal( normal );
  87. float3 worldTangent = UnityObjectToWorldDir( tangent );
  88. const float tangentSign = -1;
  89. float3 worldBinormal = normalize( cross( worldNormal, worldTangent ) * tangentSign );
  90. float4 tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
  91. float4 tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
  92. float4 tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
  93. float3 vec = float3( dot( tSpace0.xyz, normalTS ), dot( tSpace1.xyz, normalTS ), dot( tSpace2.xyz, normalTS ) );
  94. if ( normalized )
  95. {
  96. vec = normalize( vec );
  97. }
  98. return vec;
  99. }
  100. float2 PreviewFragmentSphericalUV( in float2 uv )
  101. {
  102. float3 vertexPos = PreviewFragmentPositionOS( uv );
  103. return float2( atan2( vertexPos.x, -vertexPos.z ) / UNITY_PI + 0.5, uv.y );
  104. }
  105. #endif // PREVIEW_INCLUDED