GBufferInput.bslinc 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "$ENGINE$\SurfaceData.bslinc"
  2. mixin GBufferInput
  3. {
  4. mixin SurfaceData;
  5. mixin PerCameraData;
  6. code
  7. {
  8. // Note: Only one or two sampler states are likely required, I can avoid wasting register space
  9. SamplerState gGBufferASamp;
  10. SamplerState gGBufferBSamp;
  11. SamplerState gGBufferCSamp;
  12. [alias(gDepthBufferTex)]
  13. SamplerState gDepthBufferSamp;
  14. #ifndef MSAA_COUNT
  15. #define MSAA_COUNT 1
  16. #endif
  17. #if MSAA_COUNT > 1
  18. Texture2DMS<float4> gGBufferATex;
  19. Texture2DMS<float4> gGBufferBTex;
  20. Texture2DMS<float2> gGBufferCTex;
  21. Texture2DMS<float4> gDepthBufferTex;
  22. #else
  23. Texture2D gGBufferATex;
  24. Texture2D gGBufferBTex;
  25. Texture2D gGBufferCTex;
  26. Texture2D gDepthBufferTex;
  27. #endif
  28. SurfaceData decodeGBuffer(float4 GBufferAData, float4 GBufferBData, float2 GBufferCData, float deviceZ)
  29. {
  30. SurfaceData output;
  31. output.albedo.xyz = GBufferAData.xyz;
  32. output.albedo.w = 1.0f;
  33. output.worldNormal = GBufferBData * float4(2, 2, 2, 1) - float4(1, 1, 1, 0);
  34. output.worldNormal.xyz = normalize(output.worldNormal.xyz);
  35. output.depth = convertFromDeviceZ(deviceZ);
  36. output.roughness = GBufferCData.x;
  37. output.metalness = GBufferCData.y;
  38. return output;
  39. }
  40. #if MSAA_COUNT > 1
  41. SurfaceData getGBufferData(uint2 pixelPos, uint sampleIndex)
  42. {
  43. float4 GBufferAData = gGBufferATex.Load(pixelPos, sampleIndex);
  44. float4 GBufferBData = gGBufferBTex.Load(pixelPos, sampleIndex);
  45. float2 GBufferCData = gGBufferCTex.Load(pixelPos, sampleIndex).rg;
  46. float deviceZ = gDepthBufferTex.Load(pixelPos, sampleIndex).r;
  47. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  48. }
  49. #else
  50. SurfaceData getGBufferData(uint2 pixelPos)
  51. {
  52. float4 GBufferAData = gGBufferATex.Load(int3(pixelPos, 0));
  53. float4 GBufferBData = gGBufferBTex.Load(int3(pixelPos, 0));
  54. float2 GBufferCData = gGBufferCTex.Load(int3(pixelPos, 0)).rg;
  55. float deviceZ = gDepthBufferTex.Load(int3(pixelPos, 0)).r;
  56. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  57. }
  58. SurfaceData getGBufferData(float2 uvPos)
  59. {
  60. float4 GBufferAData = gGBufferATex.Sample(gGBufferASamp, uvPos);
  61. float4 GBufferBData = gGBufferBTex.Sample(gGBufferBSamp, uvPos);
  62. float2 GBufferCData = gGBufferCTex.Sample(gGBufferCSamp, uvPos).rg;
  63. float deviceZ = gDepthBufferTex.Sample(gDepthBufferSamp, uvPos).r;
  64. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  65. }
  66. #endif
  67. };
  68. };