resizer.psh
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. sampler s0 : register(s0);
  2. sampler s1 : register(s1);
  3. sampler s2 : register(s2);
  4. sampler s3 : register(s3);
  5. sampler s4 : register(s4);
  6. float4 p0  : register(c0);
  7. float2 dxdy : register(c1);
  8. float2 dx : register(c2);
  9. float2 dy : register(c3);
  10. #define A _The_Value_Of_A_Is_Set_Here_
  11. // none of the resizers here can be used for 1:1 mapping! 
  12. // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
  13. // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
  14. struct PS_INPUT
  15. {
  16. float2 t0 : TEXCOORD0;
  17. float2 t1 : TEXCOORD1;
  18. float2 t2 : TEXCOORD2;
  19. float2 t3 : TEXCOORD3;
  20. float2 t4 : TEXCOORD4;
  21. };
  22. float4 main_bilinear(PS_INPUT input) : COLOR
  23. {
  24. float2 dd = frac(input.t4);
  25. float4 c = lerp(
  26. lerp(tex2D(s0, input.t0), tex2D(s1, input.t1), dd.x),
  27. lerp(tex2D(s2, input.t2), tex2D(s3, input.t3), dd.x),
  28. dd.y);
  29. return c;
  30. }
  31. static float4x4 tco =
  32. {
  33. 0, A, -2*A, A,
  34. 1, 0, -A-3, A+2,
  35. 0, -A, 2*A+3, -A-2,
  36. 0, 0, A, -A
  37. };
  38. float4 taps(float t)
  39. {
  40. return mul(tco, float4(1, t, t*t, t*t*t));
  41. }
  42. float4 SampleX(float4 tx, float2 t0)
  43. {
  44. return
  45. mul(tx,
  46. float4x4(
  47. tex2D(s0, t0 - dx),
  48. tex2D(s0, t0),
  49. tex2D(s0, t0 + dx),
  50. tex2D(s0, t0 + dx + dx)
  51. )
  52. );
  53. }
  54. float4 SampleY(float4 tx, float4 ty, float2 t0)
  55. {
  56. return
  57. mul(ty,
  58. float4x4(
  59. SampleX(tx, t0 - dy),
  60. SampleX(tx, t0),
  61. SampleX(tx, t0 + dy),
  62. SampleX(tx, t0 + dy + dy)
  63. )
  64. );
  65. }
  66. float4 main_bicubic1pass(PS_INPUT input) : COLOR
  67. {
  68. float2 dd = frac(input.t1);
  69. return SampleY(taps(dd.x), taps(dd.y), input.t0);
  70. // return SampleY(tex1D(s1, dd.x), tex1D(s1, dd.y), input.t0);
  71. }
  72. float4 Sample(float4 t, PS_INPUT input)
  73. {
  74. return
  75. mul(t, 
  76. float4x4(
  77. tex2D(s0, input.t0),
  78. tex2D(s1, input.t1),
  79. tex2D(s2, input.t2),
  80. tex2D(s3, input.t3)
  81. )
  82. );
  83. }
  84. float4 main_bicubic2pass(PS_INPUT input) : COLOR
  85. {
  86. float2 dd = frac(input.t4);
  87. return Sample(taps(dd.x), input);
  88. // return Sample(tex1D(s4, dd.x), input);
  89. }