Transparent.bsl 5.1 KB

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