Transparent.bsl 5.1 KB

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