Transparent.bsl 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. Pass =
  33. {
  34. DepthWrite = false;
  35. Target =
  36. {
  37. Blend = true;
  38. Color = { SRCA, SRCIA, ADD };
  39. };
  40. Fragment =
  41. {
  42. SamplerState gAlbedoSamp : register(s0);
  43. SamplerState gNormalSamp : register(s1);
  44. SamplerState gRoughnessSamp : register(s2);
  45. SamplerState gMetalnessSamp : register(s3);
  46. Texture2D gAlbedoTex : register(t0);
  47. Texture2D gNormalTex : register(t1);
  48. Texture2D gRoughnessTex : register(t2);
  49. Texture2D gMetalnessTex : register(t3);
  50. Buffer<uint4> gGridLightOffsetsAndSize;
  51. Buffer<uint2> gGridProbeOffsetsAndSize;
  52. cbuffer MaterialParams : register(b5)
  53. {
  54. float gOpacity;
  55. }
  56. float4 main(in VStoFS input) : SV_Target0
  57. {
  58. float3 normal = normalize(gNormalTex.Sample(gNormalSamp, input.uv0).xyz * 2.0f - float3(1, 1, 1));
  59. float3 worldNormal = calcWorldNormal(input, normal);
  60. SurfaceData surfaceData;
  61. surfaceData.albedo = gAlbedoTex.Sample(gAlbedoSamp, input.uv0);
  62. surfaceData.worldNormal.xyz = worldNormal;
  63. surfaceData.worldNormal.w = 1.0f;
  64. surfaceData.roughness = gRoughnessTex.Sample(gRoughnessSamp, input.uv0).x;
  65. surfaceData.metalness = gMetalnessTex.Sample(gMetalnessSamp, input.uv0).x;
  66. uint2 pixelPos = (uint2)input.position.xy;
  67. uint cellIdx = calcCellIdx(pixelPos, input.position.z);
  68. uint3 lightOffsetAndSize = gGridLightOffsetsAndSize[cellIdx].rgb;
  69. uint4 lightOffsets;
  70. lightOffsets.x = gLightOffsets[0];
  71. lightOffsets.y = lightOffsetAndSize.x;
  72. lightOffsets.z = lightOffsets.y + lightOffsetAndSize.y;
  73. lightOffsets.w = lightOffsets.z + lightOffsetAndSize.z;
  74. uint2 reflProbeOffsetAndSize = gGridProbeOffsetsAndSize[cellIdx];
  75. float3 V = normalize(gViewOrigin - input.worldPosition);
  76. float3 N = surfaceData.worldNormal.xyz;
  77. float3 R = 2 * dot(V, N) * N - V;
  78. float3 specR = getSpecularDominantDir(N, R, surfaceData.roughness);
  79. float4 directLighting = getDirectLighting(input.worldPosition, V, specR, surfaceData, lightOffsets);
  80. float3 indirectDiffuse = getSkyIndirectDiffuse(surfaceData.worldNormal) * surfaceData.albedo;
  81. float3 imageBasedSpecular = getImageBasedSpecular(input.worldPosition, V, specR, surfaceData,
  82. reflProbeOffsetAndSize.x, reflProbeOffsetAndSize.y);
  83. float3 totalLighting = directLighting.rgb;
  84. totalLighting.rgb += indirectDiffuse;
  85. totalLighting.rgb += imageBasedSpecular;
  86. return float4(totalLighting, gOpacity);
  87. }
  88. };
  89. };
  90. };