Blit.bsl 1.4 KB

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