Blit.bsl 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. shader Blit
  2. {
  3. variations
  4. {
  5. MODE =
  6. {
  7. 0, // Color (point filtering)
  8. 1, // Color (bilinear filtering)
  9. 2, // Depth
  10. };
  11. MSAA_COUNT = { 1, 2, 4, 8 };
  12. };
  13. depth
  14. {
  15. #if MODE != 2
  16. read = false;
  17. write = false;
  18. #else
  19. // Cannot use read = false because that disables gl_FragDepth writes on OpenGL
  20. compare = always;
  21. #endif
  22. };
  23. code
  24. {
  25. struct VStoFS
  26. {
  27. noperspective float4 position : SV_POSITION;
  28. noperspective float2 uv0 : TEXCOORD0;
  29. };
  30. struct VertexInput
  31. {
  32. float2 screenPos : POSITION;
  33. float2 uv0 : TEXCOORD0;
  34. };
  35. VStoFS vsmain(VertexInput input)
  36. {
  37. VStoFS output;
  38. output.position = float4(input.screenPos, 0, 1);
  39. output.uv0 = input.uv0;
  40. return output;
  41. }
  42. #if MSAA_COUNT > 1
  43. #if MODE != 2
  44. Texture2DMS<float4> gSource;
  45. float4 fsmain(VStoFS input) : SV_Target0
  46. #else // MODE
  47. // Depth
  48. Texture2DMS<float> gSource;
  49. float fsmain(VStoFS input, out float depth : SV_Depth) : SV_Target0
  50. #endif // MODE
  51. {
  52. int2 iUV = trunc(input.uv0);
  53. #if MODE != 2
  54. float4 sum = float4(0, 0, 0, 0);
  55. [unroll]
  56. for(int i = 0; i < MSAA_COUNT; i++)
  57. sum += gSource.Load(iUV, i);
  58. return sum / MSAA_COUNT;
  59. #else // MODE
  60. // Depth
  61. float minVal = gSource.Load(iUV, 0);
  62. [unroll]
  63. for(int i = 1; i < MSAA_COUNT; i++)
  64. minVal = min(minVal, gSource.Load(iUV, i));
  65. depth = minVal;
  66. return 0.0f;
  67. #endif // MODE
  68. }
  69. #else // MSAA_COUNT
  70. Texture2D<float4> gSource;
  71. #if MODE == 1
  72. SamplerState gSampler;
  73. #endif
  74. float4 fsmain(VStoFS input) : SV_Target0
  75. {
  76. #if MODE == 1
  77. return gSource.Sample(gSampler, input.uv0);
  78. #else // MODE
  79. int2 iUV = trunc(input.uv0);
  80. return gSource.Load(int3(iUV.xy, 0));
  81. #endif // MODE
  82. }
  83. #endif // MSAA_COUNT
  84. };
  85. };