Transparent.bsl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "$ENGINE$\BasePass.bslinc"
  2. #include "$ENGINE$\LightGridCommon.bslinc"
  3. #include "$ENGINE$\ReflectionCubemapCommon.bslinc"
  4. #define USE_LIGHT_GRID_INDICES 1
  5. #include "$ENGINE$\LightingCommon.bslinc"
  6. #include "$ENGINE$\ImageBasedLighting.bslinc"
  7. #include "$ENGINE$\Surface.bslinc"
  8. options
  9. {
  10. transparent = true;
  11. };
  12. mixin Surface
  13. {
  14. mixin LightingCommon;
  15. mixin LightGridCommon;
  16. mixin ReflectionCubemapCommon;
  17. mixin ImageBasedLighting;
  18. blend
  19. {
  20. target
  21. {
  22. enabled = true;
  23. color = { srcA, srcIA, add };
  24. };
  25. };
  26. depth
  27. {
  28. write = false;
  29. };
  30. code
  31. {
  32. SamplerState gAlbedoSamp : register(s0);
  33. SamplerState gNormalSamp : register(s1);
  34. SamplerState gRoughnessSamp : register(s2);
  35. SamplerState gMetalnessSamp : register(s3);
  36. Texture2D gAlbedoTex : register(t0);
  37. Texture2D gNormalTex : register(t1);
  38. Texture2D gRoughnessTex : register(t2);
  39. Texture2D gMetalnessTex : register(t3);
  40. Buffer<uint4> gGridLightOffsetsAndSize;
  41. Buffer<uint2> gGridProbeOffsetsAndSize;
  42. cbuffer MaterialParams : register(b5)
  43. {
  44. float gOpacity;
  45. }
  46. float4 fsmain(in VStoFS input) : SV_Target0
  47. {
  48. float3 normal = normalize(gNormalTex.Sample(gNormalSamp, input.uv0).xyz * 2.0f - float3(1, 1, 1));
  49. float3 worldNormal = calcWorldNormal(input, normal);
  50. SurfaceData surfaceData;
  51. surfaceData.albedo = gAlbedoTex.Sample(gAlbedoSamp, input.uv0);
  52. surfaceData.worldNormal.xyz = worldNormal;
  53. surfaceData.worldNormal.w = 1.0f;
  54. surfaceData.roughness = gRoughnessTex.Sample(gRoughnessSamp, input.uv0).x;
  55. surfaceData.metalness = gMetalnessTex.Sample(gMetalnessSamp, input.uv0).x;
  56. uint2 pixelPos = (uint2)input.position.xy;
  57. uint cellIdx = calcCellIdx(pixelPos, input.position.z);
  58. uint3 lightOffsetAndSize = gGridLightOffsetsAndSize[cellIdx].rgb;
  59. uint4 lightOffsets;
  60. lightOffsets.x = gLightCounts.x;
  61. lightOffsets.y = lightOffsetAndSize.x;
  62. lightOffsets.z = lightOffsets.y + lightOffsetAndSize.y;
  63. lightOffsets.w = lightOffsets.z + lightOffsetAndSize.z;
  64. uint2 reflProbeOffsetAndSize = gGridProbeOffsetsAndSize[cellIdx];
  65. float3 V = normalize(gViewOrigin - input.worldPosition);
  66. float3 N = surfaceData.worldNormal.xyz;
  67. float3 R = 2 * dot(V, N) * N - V;
  68. float3 specR = getSpecularDominantDir(N, R, surfaceData.roughness);
  69. float4 directLighting = getDirectLighting(input.worldPosition, V, specR, surfaceData, lightOffsets);
  70. float ao = gAmbientOcclusionTex.Sample(gAmbientOcclusionSamp, input.uv0);
  71. float4 ssr = gSSRTex.Sample(gSSRSamp, input.uv0);
  72. float3 imageBasedSpecular = getImageBasedSpecular(input.worldPosition, V, specR, surfaceData, ao, ssr,
  73. reflProbeOffsetAndSize.x, reflProbeOffsetAndSize.y);
  74. float3 totalLighting = directLighting.rgb;
  75. totalLighting.rgb += imageBasedSpecular;
  76. return float4(totalLighting, gOpacity);
  77. }
  78. };
  79. };