GBufferInput.bslinc 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. // Not being read at the moment, as these are only needed in specific circumstances
  39. output.mask = 0;
  40. output.velocity = 0.0f;
  41. return output;
  42. }
  43. #if MSAA_COUNT > 1
  44. SurfaceData getGBufferData(uint2 pixelPos, uint sampleIndex)
  45. {
  46. float4 GBufferAData = gGBufferATex.Load(pixelPos, sampleIndex);
  47. float4 GBufferBData = gGBufferBTex.Load(pixelPos, sampleIndex);
  48. float2 GBufferCData = gGBufferCTex.Load(pixelPos, sampleIndex).rg;
  49. float deviceZ = gDepthBufferTex.Load(pixelPos, sampleIndex).r;
  50. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  51. }
  52. #else
  53. SurfaceData getGBufferData(uint2 pixelPos)
  54. {
  55. float4 GBufferAData = gGBufferATex.Load(int3(pixelPos, 0));
  56. float4 GBufferBData = gGBufferBTex.Load(int3(pixelPos, 0));
  57. float2 GBufferCData = gGBufferCTex.Load(int3(pixelPos, 0)).rg;
  58. float deviceZ = gDepthBufferTex.Load(int3(pixelPos, 0)).r;
  59. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  60. }
  61. SurfaceData getGBufferData(float2 uvPos)
  62. {
  63. float4 GBufferAData = gGBufferATex.Sample(gGBufferASamp, uvPos);
  64. float4 GBufferBData = gGBufferBTex.Sample(gGBufferBSamp, uvPos);
  65. float2 GBufferCData = gGBufferCTex.Sample(gGBufferCSamp, uvPos).rg;
  66. float deviceZ = gDepthBufferTex.Sample(gDepthBufferSamp, uvPos).r;
  67. return decodeGBuffer(GBufferAData, GBufferBData, GBufferCData, deviceZ);
  68. }
  69. #endif
  70. };
  71. };