DeferredBasePass.bslinc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "$ENGINE$\GBuffer.bslinc"
  2. #include "$ENGINE$\PerCameraData.bslinc"
  3. #include "$ENGINE$\PerObjectData.bslinc"
  4. Technique =
  5. {
  6. Language = "HLSL11";
  7. Pass =
  8. {
  9. Common =
  10. {
  11. struct VStoFS
  12. {
  13. float4 position : SV_Position;
  14. float2 uv0 : TEXCOORD0;
  15. float3 worldPosition : POSITION;
  16. float3 tangentToWorldZ : NORMAL;
  17. float4 tangentToWorldX : TANGENT;
  18. };
  19. };
  20. Vertex =
  21. {
  22. struct VertexInput
  23. {
  24. float3 position : POSITION;
  25. float3 normal : NORMAL;
  26. float4 tangent : TANGENT;
  27. float2 uv0 : TEXCOORD0;
  28. };
  29. float3x3 getTangentToObject(VertexInput input, out float tangentSign)
  30. {
  31. float3x3 output;
  32. float3 normal = input.normal;
  33. float4 tangent = input.tangent;
  34. float3 bitangent = cross(normal, tangent.xyz) * tangent.w;
  35. tangentSign = tangent.w * gWorldDeterminantSign;
  36. // Note: Maybe it's better to store everything in row vector format?
  37. output[0][0] = tangent.x;
  38. output[1][0] = tangent.y;
  39. output[2][0] = tangent.z;
  40. output[0][1] = bitangent.x;
  41. output[1][1] = bitangent.y;
  42. output[2][1] = bitangent.z;
  43. output[0][2] = normal.x;
  44. output[1][2] = normal.y;
  45. output[2][2] = normal.z;
  46. return output;
  47. }
  48. VStoFS main(VertexInput input)
  49. {
  50. VStoFS output;
  51. float4 worldPosition = mul(gMatWorld, float4(input.position, 1));
  52. output.position = mul(gMatViewProj, worldPosition);
  53. output.worldPosition = worldPosition.xyz;
  54. output.uv0 = input.uv0;
  55. float tangentSign;
  56. float3x3 tangentToWorld = mul((float3x3)gMatWorldNoScale, getTangentToObject(input, tangentSign));
  57. output.tangentToWorldZ = float3(tangentToWorld._m02_m12_m22); // Normal basis vector
  58. output.tangentToWorldX = float4(tangentToWorld._m00_m10_m20, tangentSign); // Tangent basis vector
  59. return output;
  60. }
  61. };
  62. Fragment =
  63. {
  64. float3 calcWorldNormal(VStoFS input, float3 surfaceNormal)
  65. {
  66. float3 tangentToWorldX = input.tangentToWorldX.xyz;
  67. float3 tangentToWorldZ = input.tangentToWorldZ;
  68. float3 tangentToWorldY = cross(tangentToWorldZ, tangentToWorldX) * input.tangentToWorldX.w;
  69. float3x3 tangentToWorld = float3x3(tangentToWorldX, tangentToWorldY, tangentToWorldZ);
  70. // Multiplication order flipped because we stored basis vectors as rows
  71. return normalize(mul(surfaceNormal, tangentToWorld));
  72. }
  73. };
  74. };
  75. };
  76. Technique =
  77. {
  78. Language = "GLSL";
  79. Pass =
  80. {
  81. Common =
  82. {
  83. varying vec4 position;
  84. varying vec2 uv0;
  85. varying vec3 worldPosition;
  86. varying vec3 tangentToWorldZ;
  87. varying vec4 tangentToWorldX;
  88. };
  89. Vertex =
  90. {
  91. in vec3 bs_position;
  92. in vec3 bs_normal;
  93. in vec4 bs_tangent;
  94. in vec2 bs_texcoord0;
  95. out gl_PerVertex
  96. {
  97. vec4 gl_Position;
  98. };
  99. void getTangentToObject(vec3 normal, vec4 tangent, out float tangentSign, out mat3 tangentToObject)
  100. {
  101. vec3 bitangent = cross(normal, tangent.xyz) * tangent.w;
  102. tangentSign = tangent.w * gWorldDeterminantSign;
  103. tangentToObject[0] = tangent.xyz;
  104. tangentToObject[1] = bitangent;
  105. tangentToObject[2] = normal;
  106. }
  107. void main()
  108. {
  109. vec4 worldPos = gMatWorld * vec4(bs_position, 1);
  110. position = gMatViewProj * worldPos;
  111. worldPosition = worldPos.xyz;
  112. uv0 = bs_texcoord0;
  113. float tangentSign;
  114. mat3 tangentToObject;
  115. getTangentToObject(bs_normal, bs_tangent, tangentSign, tangentToObject);
  116. mat3 tangentToWorld = mat3(gMatWorldNoScale) * tangentToObject;
  117. tangentToWorldZ = tangentToWorld[2]; // Normal basis vector
  118. tangentToWorldX = vec4(tangentToWorld[0].xyz, tangentSign); // Tangent basis vector
  119. gl_Position = position;
  120. }
  121. };
  122. Fragment =
  123. {
  124. vec3 calcWorldNormal(vec3 normal, vec4 tangent, vec3 surfaceNormal)
  125. {
  126. vec3 tangentToWorldX = tangent.xyz;
  127. vec3 tangentToWorldZ = normal;
  128. vec3 tangentToWorldY = cross(tangentToWorldZ, tangentToWorldX) * tangent.w;
  129. mat3 tangentToWorld = mat3(tangentToWorldX, tangentToWorldY, tangentToWorldZ);
  130. return normalize(tangentToWorld * surfaceNormal);
  131. }
  132. };
  133. };
  134. };