Blit.bsl 1.5 KB

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