resizer.psh
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. sampler s0 : register(s0);
  2. float4 p0  : register(c0);
  3. float2 dxdy : register(c1);
  4. float2 dx : register(c2);
  5. float2 dy : register(c3);
  6. #define size (p0.xy)
  7. #define A _The_Value_Of_A_Is_Set_Here_
  8. float4 main_bilinear(float2 tex : TEXCOORD0) : COLOR
  9. {
  10. // not usable for 1:1 mapping! 
  11. // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
  12. // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
  13. tex -= 0.5*dxdy;
  14. float2 dd = frac(tex * size); 
  15. float4 c = lerp(
  16. lerp(tex2D(s0, tex), tex2D(s0, tex + dx), dd.x),
  17. lerp(tex2D(s0, tex + dy), tex2D(s0, tex + dxdy), dd.x),
  18. dd.y);
  19. return c;
  20. }
  21. static float4x4 tco =
  22. {
  23. 0, A, -2*A, A,
  24. 1, 0, -A-3, A+2,
  25. 0, -A, 2*A+3, -A-2,
  26. 0, 0, A, -A
  27. };
  28. float4 taps(float x)
  29. {
  30. return mul(tco, float4(1, x, x*x, x*x*x));
  31. }
  32. float4 c3sample(float4 taps, float2 t)
  33. {
  34. return
  35. mul(taps,
  36. float4x4(
  37. tex2D(s0, t-dx),
  38. tex2D(s0, t),
  39. tex2D(s0, t+dx),
  40. tex2D(s0, t+dx+dx)
  41. )
  42. );
  43. }
  44. float4 main_bicubic(float2 tex : TEXCOORD0) : COLOR
  45. {
  46. // not usable for 1:1 mapping! 
  47. // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
  48. // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
  49. tex -= 0.49*dxdy; // at 0.5 nvidia cards show visible artifacts, sometimes...
  50. float2 dd = frac(tex * size);
  51. float4 tx = taps(dd.x);
  52. float4 c = mul(
  53. taps(dd.y),
  54. float4x4(
  55. c3sample(tx, tex-dy),
  56. c3sample(tx, tex),
  57. c3sample(tx, tex+dy),
  58. c3sample(tx, tex+dy+dy)
  59. )
  60. );
  61. return c;
  62. }