Transparent.bsl 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "$ENGINE$\BasePass.bslinc"
  2. #include "$ENGINE$\LightGridCommon.bslinc"
  3. #include "$ENGINE$\ReflectionCubemapCommon.bslinc"
  4. #define USE_LIGHT_GRID_INDICES
  5. #include "$ENGINE$\LightingCommon.bslinc"
  6. #include "$ENGINE$\ImageBasedLighting.bslinc"
  7. #include "$ENGINE$\Surface.bslinc"
  8. Parameters =
  9. {
  10. Sampler2D gAlbedoSamp : alias("gAlbedoTex");
  11. Sampler2D gNormalSamp : alias("gNormalTex");
  12. Sampler2D gRoughnessSamp : alias("gRoughnessTex");
  13. Sampler2D gMetalnessSamp : alias("gMetalnessTex");
  14. Texture2D gAlbedoTex;
  15. Texture2D gNormalTex = "normal";
  16. Texture2D gRoughnessTex = "white";
  17. Texture2D gMetalnessTex = "black";
  18. float gOpacity = 1.0f;
  19. };
  20. Blocks =
  21. {
  22. Block MaterialParams;
  23. };
  24. Transparent = true;
  25. Technique
  26. : inherits("LightingCommon")
  27. : inherits("LightGridCommon")
  28. : inherits("ReflectionCubemapCommon")
  29. : inherits("ImageBasedLighting")
  30. : base("Surface") =
  31. {
  32. Language = "HLSL11";
  33. Pass =
  34. {
  35. DepthWrite = false;
  36. Target =
  37. {
  38. Blend = true;
  39. Color = { SRCA, SRCIA, ADD };
  40. };
  41. Fragment =
  42. {
  43. SamplerState gAlbedoSamp : register(s0);
  44. SamplerState gNormalSamp : register(s1);
  45. SamplerState gRoughnessSamp : register(s2);
  46. SamplerState gMetalnessSamp : register(s3);
  47. Texture2D gAlbedoTex : register(t0);
  48. Texture2D gNormalTex : register(t1);
  49. Texture2D gRoughnessTex : register(t2);
  50. Texture2D gMetalnessTex : register(t3);
  51. Buffer<uint4> gGridLightOffsetsAndSize;
  52. Buffer<uint2> gGridProbeOffsetsAndSize;
  53. cbuffer MaterialParams : register(b5)
  54. {
  55. float gOpacity;
  56. }
  57. float4 main(in VStoFS input) : SV_Target0
  58. {
  59. float3 normal = normalize(gNormalTex.Sample(gNormalSamp, input.uv0).xyz * 2.0f - float3(1, 1, 1));
  60. float3 worldNormal = calcWorldNormal(input, normal);
  61. SurfaceData surfaceData;
  62. surfaceData.albedo = gAlbedoTex.Sample(gAlbedoSamp, input.uv0);
  63. surfaceData.worldNormal.xyz = worldNormal;
  64. surfaceData.worldNormal.w = 0.0f;
  65. surfaceData.roughness = gRoughnessTex.Sample(gRoughnessSamp, input.uv0).x;
  66. surfaceData.metalness = gMetalnessTex.Sample(gMetalnessSamp, input.uv0).x;
  67. uint2 pixelPos = (uint2)input.position.xy;
  68. uint cellIdx = calcCellIdx(pixelPos, input.position.z);
  69. uint3 lightOffsetAndSize = gGridLightOffsetsAndSize[cellIdx].rgb;
  70. uint4 lightOffsets;
  71. lightOffsets.x = gLightOffsets[0];
  72. lightOffsets.y = lightOffsetAndSize.x;
  73. lightOffsets.z = lightOffsets.y + lightOffsetAndSize.y;
  74. lightOffsets.w = lightOffsets.z + lightOffsetAndSize.z;
  75. uint2 reflProbeOffsetAndSize = gGridProbeOffsetsAndSize[cellIdx];
  76. float3 V = normalize(gViewOrigin - input.worldPosition);
  77. float3 N = surfaceData.worldNormal.xyz;
  78. float3 R = 2 * dot(V, N) * N - V;
  79. float3 specR = getSpecularDominantDir(N, R, surfaceData.roughness);
  80. float4 directLighting = getDirectLighting(input.worldPosition, V, specR, surfaceData, lightOffsets);
  81. float3 indirectDiffuse = getSkyIndirectDiffuse(surfaceData.worldNormal) * surfaceData.albedo;
  82. float3 imageBasedSpecular = getImageBasedSpecular(input.worldPosition, V, specR, surfaceData,
  83. reflProbeOffsetAndSize.x, reflProbeOffsetAndSize.y);
  84. float3 totalLighting = directLighting.rgb;
  85. totalLighting.rgb += indirectDiffuse;
  86. totalLighting.rgb += imageBasedSpecular;
  87. return float4(totalLighting, gOpacity);
  88. }
  89. };
  90. };
  91. };
  92. Technique
  93. : inherits("LightingCommon")
  94. : inherits("LightGridCommon")
  95. : base("Surface") =
  96. {
  97. Language = "GLSL";
  98. Pass =
  99. {
  100. DepthWrite = false;
  101. Target =
  102. {
  103. Blend = true;
  104. Color = { SRCA, SRCIA, ADD };
  105. };
  106. Fragment =
  107. {
  108. layout(location = 0) in vec2 uv0;
  109. layout(location = 1) in vec3 worldPosition;
  110. layout(location = 2) in vec3 tangentToWorldZ;
  111. layout(location = 3) in vec4 tangentToWorldX;
  112. layout(binding = 5) uniform sampler2D gAlbedoTex;
  113. layout(binding = 6) uniform sampler2D gNormalTex;
  114. layout(binding = 7) uniform sampler2D gRoughnessTex;
  115. layout(binding = 8) uniform sampler2D gMetalnessTex;
  116. layout(binding = 9) uniform usamplerBuffer gGridOffsetsAndSize;
  117. layout(binding = 10) uniform usamplerBuffer gGridLightIndices;
  118. layout(std430, binding = 11) readonly buffer gLights
  119. {
  120. LightData[] gLightsData;
  121. };
  122. layout(binding = 12, std140) uniform MaterialParams
  123. {
  124. float gOpacity;
  125. };
  126. layout(location = 0) out vec4 fragColor;
  127. void main()
  128. {
  129. vec3 normal = normalize(texture(gNormalTex, uv0).xyz * 2.0f - vec3(1, 1, 1));
  130. vec3 worldNormal = calcWorldNormal(tangentToWorldZ, tangentToWorldX, normal);
  131. SurfaceData surfaceData;
  132. surfaceData.albedo = texture(gAlbedoTex, uv0);
  133. surfaceData.worldNormal.xyz = worldNormal;
  134. surfaceData.roughness = texture(gRoughnessTex, uv0).x;
  135. surfaceData.metalness = texture(gMetalnessTex, uv0).x;
  136. // Directional lights
  137. vec3 lightAccumulator = vec3(0, 0, 0);
  138. for(uint i = 0; i < gLightOffsets[0]; ++i)
  139. {
  140. LightData lightData = gLightsData[i];
  141. lightAccumulator += getDirLightContibution(surfaceData, lightData);
  142. }
  143. uvec2 pixelPos = uvec2(gl_FragCoord.xy);
  144. int cellIdx = calcCellIdx(pixelPos, gl_FragCoord.z);
  145. uvec3 offsetAndSize = texelFetch(gGridOffsetsAndSize, cellIdx).xyz;
  146. // Radial lights
  147. int i = int(offsetAndSize.x);
  148. uint end = offsetAndSize.x + offsetAndSize.y;
  149. for(; i < end; i++)
  150. {
  151. uint lightIndex = texelFetch(gGridLightIndices, i).x;
  152. LightData lightData = gLightsData[lightIndex];
  153. lightAccumulator += getPointLightContribution(worldPosition, surfaceData, lightData);
  154. }
  155. // Spot lights
  156. end += offsetAndSize.z;
  157. for(; i < end; i++)
  158. {
  159. uint lightIndex = texelFetch(gGridLightIndices, i).x;
  160. LightData lightData = gLightsData[lightIndex];
  161. lightAccumulator += getSpotLightContribution(worldPosition, surfaceData, lightData);
  162. }
  163. lightAccumulator += surfaceData.albedo.xyz * gAmbientFactor;
  164. vec3 diffuse = surfaceData.albedo.xyz / PI; // TODO - Add better lighting model later
  165. fragColor = vec4(diffuse * lightAccumulator, gOpacity);
  166. }
  167. };
  168. };
  169. };