Transparent.bsl 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. float3 diffuse = surfaceData.albedo.xyz / PI;
  76. return float4(diffuse * lightAccumulator, gOpacity); // TODO - Add better lighting model later
  77. }
  78. };
  79. };
  80. };
  81. Technique
  82. : inherits("LightingCommon")
  83. : inherits("LightGridCommon")
  84. : base("Surface") =
  85. {
  86. Language = "GLSL";
  87. Pass =
  88. {
  89. DepthWrite = false;
  90. Target =
  91. {
  92. Blend = true;
  93. Color = { SRCA, SRCIA, ADD };
  94. };
  95. Fragment =
  96. {
  97. layout(location = 0) in vec2 uv0;
  98. layout(location = 1) in vec3 worldPosition;
  99. layout(location = 2) in vec3 tangentToWorldZ;
  100. layout(location = 3) in vec4 tangentToWorldX;
  101. layout(binding = 5) uniform sampler2D gAlbedoTex;
  102. layout(binding = 6) uniform sampler2D gNormalTex;
  103. layout(binding = 7) uniform usamplerBuffer gGridOffsetsAndSize;
  104. layout(binding = 8) uniform usamplerBuffer gGridLightIndices;
  105. layout(std430, binding = 9) readonly buffer gLights
  106. {
  107. LightData[] gLightsData;
  108. };
  109. layout(binding = 10, std140) uniform MaterialParams
  110. {
  111. float gOpacity;
  112. };
  113. layout(location = 0) out vec4 fragColor;
  114. void main()
  115. {
  116. vec3 normal = normalize(texture(gNormalTex, uv0).xyz * 2.0f - vec3(1, 1, 1));
  117. vec3 worldNormal = calcWorldNormal(tangentToWorldZ, tangentToWorldX, normal);
  118. SurfaceData surfaceData;
  119. surfaceData.albedo = texture(gAlbedoTex, uv0);
  120. surfaceData.worldNormal.xyz = worldNormal;
  121. // Directional lights
  122. vec3 lightAccumulator = vec3(0, 0, 0);
  123. for(uint i = 0; i < gLightOffsets[0]; ++i)
  124. {
  125. LightData lightData = gLightsData[i];
  126. lightAccumulator += getDirLightContibution(surfaceData, lightData);
  127. }
  128. uvec2 pixelPos = uvec2(gl_FragCoord.xy);
  129. int cellIdx = calcCellIdx(pixelPos, gl_FragCoord.z);
  130. uvec3 offsetAndSize = texelFetch(gGridOffsetsAndSize, cellIdx).xyz;
  131. // Radial lights
  132. int i = int(offsetAndSize.x);
  133. uint end = offsetAndSize.x + offsetAndSize.y;
  134. for(; i < end; i++)
  135. {
  136. uint lightIndex = texelFetch(gGridLightIndices, i).x;
  137. LightData lightData = gLightsData[lightIndex];
  138. lightAccumulator += getPointLightContribution(worldPosition, surfaceData, lightData);
  139. }
  140. // Spot lights
  141. end += offsetAndSize.z;
  142. for(; i < end; i++)
  143. {
  144. uint lightIndex = texelFetch(gGridLightIndices, i).x;
  145. LightData lightData = gLightsData[lightIndex];
  146. lightAccumulator += getSpotLightContribution(worldPosition, surfaceData, lightData);
  147. }
  148. vec3 diffuse = surfaceData.albedo.xyz / PI; // TODO - Add better lighting model later
  149. fragColor = vec4(diffuse * lightAccumulator, gOpacity);
  150. }
  151. };
  152. };
  153. };
  154. #include "$ENGINE$\Surface.bslinc"