GBufferInput.bslinc 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. SamplerState gDepthBufferSamp;
  13. #ifndef MSAA_COUNT
  14. #define MSAA_COUNT 1
  15. #endif
  16. #if MSAA_COUNT > 1
  17. Texture2DMS<float4> gGBufferATex;
  18. Texture2DMS<float4> gGBufferBTex;
  19. Texture2DMS<float2> gGBufferCTex;
  20. Texture2DMS<float4> gDepthBufferTex;
  21. #else
  22. Texture2D gGBufferATex;
  23. Texture2D gGBufferBTex;
  24. Texture2D gGBufferCTex;
  25. Texture2D gDepthBufferTex;
  26. #endif
  27. SurfaceData decodeGBuffer(float4 GBufferAData, float4 GBufferBData, float2 GBufferCData, float deviceZ)
  28. {
  29. SurfaceData output;
  30. output.albedo.xyz = GBufferAData.xyz;
  31. output.albedo.w = 1.0f;
  32. output.worldNormal = GBufferBData * float4(2, 2, 2, 1) - float4(1, 1, 1, 0);
  33. output.worldNormal.xyz = normalize(output.worldNormal.xyz);
  34. output.depth = convertFromDeviceZ(deviceZ);
  35. output.roughness = GBufferCData.x;
  36. output.metalness = GBufferCData.y;
  37. return output;
  38. }
  39. #if MSAA_COUNT > 1
  40. SurfaceData getGBufferData(uint2 pixelPos, uint sampleIndex)
  41. {
  42. float4 GBufferAData = gGBufferATex.Load(pixelPos, sampleIndex);
  43. float4 GBufferBData = gGBufferBTex.Load(pixelPos, sampleIndex);
  44. float2 GBufferCData = gGBufferCTex.Load(pixelPos, sampleIndex).rg;
  45. float deviceZ = gDepthBufferTex.Load(pixelPos, sampleIndex).r;
  46. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  47. }
  48. #else
  49. SurfaceData getGBufferData(uint2 pixelPos)
  50. {
  51. float4 GBufferAData = gGBufferATex.Load(int3(pixelPos, 0));
  52. float4 GBufferBData = gGBufferBTex.Load(int3(pixelPos, 0));
  53. float2 GBufferCData = gGBufferCTex.Load(int3(pixelPos, 0)).rg;
  54. float deviceZ = gDepthBufferTex.Load(int3(pixelPos, 0)).r;
  55. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  56. }
  57. SurfaceData getGBufferData(float2 uvPos)
  58. {
  59. float4 GBufferAData = gGBufferATex.Sample(gGBufferASamp, uvPos);
  60. float4 GBufferBData = gGBufferBTex.Sample(gGBufferBSamp, uvPos);
  61. float2 GBufferCData = gGBufferCTex.Sample(gGBufferCSamp, uvPos).rg;
  62. float deviceZ = gDepthBufferTex.Sample(gDepthBufferSamp, uvPos).r;
  63. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  64. }
  65. #endif
  66. };
  67. };