area.effect 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. uniform float4x4 ViewProj;
  2. uniform float4x4 color_matrix;
  3. uniform float3 color_range_min = {0.0, 0.0, 0.0};
  4. uniform float3 color_range_max = {1.0, 1.0, 1.0};
  5. uniform float2 base_dimension_i;
  6. uniform texture2d image;
  7. struct VertInOut {
  8. float4 pos : POSITION;
  9. float2 uv : TEXCOORD0;
  10. };
  11. VertInOut VSDefault(VertInOut vert_in)
  12. {
  13. VertInOut vert_out;
  14. vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj);
  15. vert_out.uv = vert_in.uv;
  16. return vert_out;
  17. }
  18. float4 PSDrawAreaRGBA(VertInOut vert_in) : TARGET
  19. {
  20. float4 totalcolor = float4(0.0, 0.0, 0.0, 0.0);
  21. float2 uv = vert_in.uv;
  22. float2 uvdelta = float2(ddx(uv.x), ddy(uv.y));
  23. // Handle potential OpenGL flip.
  24. uvdelta.y = abs(uvdelta.y);
  25. float2 uvhalfdelta = 0.5 * uvdelta;
  26. float2 uvmin = uv - uvhalfdelta;
  27. float2 uvmax = uv + uvhalfdelta;
  28. int2 loadindexmin = int2(uvmin / base_dimension_i);
  29. int2 loadindexmax = int2(uvmax / base_dimension_i);
  30. float2 targetpos = uv / uvdelta;
  31. float2 targetposmin = targetpos - 0.5;
  32. float2 targetposmax = targetpos + 0.5;
  33. float2 scale = base_dimension_i / uvdelta;
  34. for (int loadindexy = loadindexmin.y; loadindexy <= loadindexmax.y; ++loadindexy)
  35. {
  36. for (int loadindexx = loadindexmin.x; loadindexx <= loadindexmax.x; ++loadindexx)
  37. {
  38. int2 loadindex = int2(loadindexx, loadindexy);
  39. float2 potentialtargetmin = float2(loadindex) * scale;
  40. float2 potentialtargetmax = potentialtargetmin + scale;
  41. float2 targetmin = max(potentialtargetmin, targetposmin);
  42. float2 targetmax = min(potentialtargetmax, targetposmax);
  43. float area = (targetmax.x - targetmin.x) * (targetmax.y - targetmin.y);
  44. float4 sample = image.Load(int3(loadindex, 0));
  45. totalcolor += area * float4(sample.rgb * sample.a, sample.a);
  46. }
  47. }
  48. return float4(totalcolor.rgb / totalcolor.a, totalcolor.a);
  49. }
  50. float3 ConvertFromYuv(float3 yuv)
  51. {
  52. yuv = clamp(yuv, color_range_min, color_range_max);
  53. return saturate(mul(float4(yuv, 1.0), color_matrix)).rgb;
  54. }
  55. float4 PSDrawAreaMatrix(VertInOut vert_in) : TARGET
  56. {
  57. float3 totalcolor = float3(0.0, 0.0, 0.0);
  58. float2 uv = vert_in.uv;
  59. float2 uvdelta = float2(ddx(uv.x), ddy(uv.y));
  60. // Handle potential OpenGL flip.
  61. uvdelta.y = abs(uvdelta.y);
  62. float2 uvhalfdelta = 0.5 * uvdelta;
  63. float2 uvmin = uv - uvhalfdelta;
  64. float2 uvmax = uv + uvhalfdelta;
  65. int2 loadindexmin = int2(uvmin / base_dimension_i);
  66. int2 loadindexmax = int2(uvmax / base_dimension_i);
  67. float2 targetpos = uv / uvdelta;
  68. float2 targetposmin = targetpos - 0.5;
  69. float2 targetposmax = targetpos + 0.5;
  70. float2 scale = base_dimension_i / uvdelta;
  71. for (int loadindexy = loadindexmin.y; loadindexy <= loadindexmax.y; ++loadindexy)
  72. {
  73. for (int loadindexx = loadindexmin.x; loadindexx <= loadindexmax.x; ++loadindexx)
  74. {
  75. int2 loadindex = int2(loadindexx, loadindexy);
  76. float2 potentialtargetmin = float2(loadindex) * scale;
  77. float2 potentialtargetmax = potentialtargetmin + scale;
  78. float2 targetmin = max(potentialtargetmin, targetposmin);
  79. float2 targetmax = min(potentialtargetmax, targetposmax);
  80. float area = (targetmax.x - targetmin.x) * (targetmax.y - targetmin.y);
  81. float3 yuv = image.Load(int3(loadindex, 0)).xyz;
  82. totalcolor += area * ConvertFromYuv(yuv);
  83. }
  84. }
  85. return float4(totalcolor, 1.0);
  86. }
  87. technique Draw
  88. {
  89. pass
  90. {
  91. vertex_shader = VSDefault(vert_in);
  92. pixel_shader = PSDrawAreaRGBA(vert_in);
  93. }
  94. }
  95. technique DrawMatrix
  96. {
  97. pass
  98. {
  99. vertex_shader = VSDefault(vert_in);
  100. pixel_shader = PSDrawAreaMatrix(vert_in);
  101. }
  102. }