Guest User

Untitled

a guest
Sep 18th, 2016
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1.  
  2. //================================================================
  3. //大域設定値
  4. //Texture
  5. sampler sampler0_ : register(s0);
  6.  
  7. //--------------------------------
  8. //ゆがみ生成用パラメータ
  9. static const float RENDER_WIDTH = 1024; //レンダリングテクスチャの幅
  10. static const float RENDER_HEIGHT = 1024; //レンダリングテクスチャの高さ
  11.  
  12. float frame_; //フレーム数
  13. float enemyX_; //敵の位置X
  14. float enemyY_; //敵の位置Y
  15. float waveRadius_; //エフェクトの半径
  16.  
  17.  
  18. //================================================================
  19. //--------------------------------
  20. //ピクセルシェーダ入力値
  21. struct PS_INPUT
  22. {
  23. float4 diffuse : COLOR0; //ディフューズ色
  24. float2 texCoord : TEXCOORD0; //テクスチャ座標
  25. float2 vPos : VPOS; //描画先座標
  26. };
  27.  
  28. //--------------------------------
  29. //ピクセルシェーダ出力値
  30. struct PS_OUTPUT
  31. {
  32. float4 color : COLOR0; //出力色
  33. };
  34.  
  35.  
  36. //================================================================
  37. // シェーダ
  38. //--------------------------------
  39. //ピクセルシェーダ
  40. PS_OUTPUT PsWave( PS_INPUT In ) : COLOR0
  41. {
  42. PS_OUTPUT Out;
  43.  
  44. //--------------------------------
  45. //ゆらぎを計算
  46. float dist2 = pow(In.vPos.x-enemyX_ ,2) + pow(In.vPos.y-enemyY_ ,2);
  47. float dist = sqrt(dist2);
  48. float sinTheta = (In.vPos.y - enemyY_) / dist;
  49. float cosTheta = (In.vPos.x - enemyX_) / dist;
  50.  
  51. //歪み作成用のsinに使用する角度パラメータ
  52. float angle = In.vPos.y - enemyY_ + In.vPos.x - enemyX_ + frame_;
  53. angle = radians(angle);
  54.  
  55. //該当ピクセルの歪みの半径を計算
  56. //エフェクト半径の1/16を最大の歪み幅とする
  57. float waveRadius = waveRadius_ + waveRadius_/16 * (-1 + sin(angle));
  58.  
  59. //中心から距離が離れるほど影響を小さくする
  60. float powerRatio = (waveRadius - dist) / waveRadius;
  61. if(powerRatio < 0){powerRatio = 0;}
  62.  
  63. //色情報を取得する位置のバイアス値
  64. float biasRadius = waveRadius * powerRatio;
  65. float biasX = biasRadius * cosTheta;
  66. float biasY = biasRadius * sinTheta;
  67.  
  68. //テクスチャの色情報を取得する位置
  69. float2 texUV;
  70. texUV.x = -biasX / RENDER_WIDTH + In.texCoord.x;
  71. texUV.y = -biasY / RENDER_HEIGHT + In.texCoord.y;
  72.  
  73.  
  74. //--------------------------------
  75. //テクスチャの色
  76. float4 colorTexture = tex2D(sampler0_, texUV);
  77.  
  78. //頂点ディフーズ色
  79. float4 colorDiffuse = In.diffuse;
  80.  
  81. //合成
  82. float4 color = colorTexture * colorDiffuse;
  83.  
  84. //色を赤っぽく変化させる
  85. if(powerRatio > 0)
  86. {
  87. color.g = color.g * (1 - powerRatio);
  88. color.b = color.b * (1 - powerRatio);
  89. }
  90.  
  91. Out.color = color;
  92.  
  93. return Out;
  94. }
  95.  
  96.  
  97. //================================================================
  98. //--------------------------------
  99. //technique
  100. technique TecWave
  101. {
  102. pass P0
  103. {
  104. PixelShader = compile ps_3_0 PsWave();
  105. }
  106. }
Add Comment
Please, Sign In to add comment