DXライブラリで選択範囲を囲む4隅の座標を知りたい
Posted: 2014年8月07日(木) 21:30
DXライブラリでペイントソフトを作っています。ペイントソフトでよくある自動選択機能は出来たのですが、今度はそれを変形するために、その選択範囲を囲む4隅の座標を取得するプログラムが書けずに悩んでいます。
文章で書くと分かりづらいので、図で解説します。
http://s1.gazo.cc/up/95035.png

白が、透過しています。黒い円が選択範囲です。知りたいのはpnt1~4の座標です。なお、pnt1~pnt4を直線でつなぐと、長方形になります。
ピクセルシェーダにプログラム内の変数を渡して座標を取得しようとしたのですが、SetPSConstF関数で設定する変数は代入することはできないという趣旨のエラーメッセージが出ました。(後述)
何か、座標を取得する良いアイデアはありますでしょうか?
環境
Windows7 64bit
VisualStdio C++2008
以下、失敗したfxファイルです(cfPointOneとcfPointTwoは、pnt1~4の座標です。現在のテクスチャ座標が透過していないなら、pnt1~4の座標を変更しています)
シェーダコンパイル時のエラーメッセージ
文章で書くと分かりづらいので、図で解説します。
http://s1.gazo.cc/up/95035.png

白が、透過しています。黒い円が選択範囲です。知りたいのはpnt1~4の座標です。なお、pnt1~pnt4を直線でつなぐと、長方形になります。
ピクセルシェーダにプログラム内の変数を渡して座標を取得しようとしたのですが、SetPSConstF関数で設定する変数は代入することはできないという趣旨のエラーメッセージが出ました。(後述)
何か、座標を取得する良いアイデアはありますでしょうか?
環境
Windows7 64bit
VisualStdio C++2008
以下、失敗したfxファイルです(cfPointOneとcfPointTwoは、pnt1~4の座標です。現在のテクスチャ座標が透過していないなら、pnt1~4の座標を変更しています)
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ;
float4 SpecularColor : COLOR1 ;
float2 TextureCoord0 : TEXCOORD0 ;//現在参照しているテクスチャの座標が入っています(xとyそれぞれ0.0f~1.0fの値)
float2 TextureCoord1 : TEXCOORD1 ;
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Output : COLOR0 ;
} ;
// 描画するテクスチャ
sampler Texture : register( s0 ) ;
// 選択点4隅の座標
float4 cfPointOne : register( c0 ) ;
float4 cfPointTwo : register( c1 ) ;
PS_OUTPUT main( PS_INPUT PSInput ) //入力値
{
PS_OUTPUT PSOutput ;
float4 TextureColor;
TextureColor = tex2D( Texture , PSInput.TextureCoord0 );
if(TextureColor.a>0.0f )
{
if(cfPointOne.x > PSInput.TextureCoord0.x)
{
cfPointOne.x=PSInput.TextureCoord0.x;
cfPointTwo.x=PSInput.TextureCoord0.x;
}
if(cfPointOne.y > PSInput.TextureCoord0.y)
{
cfPointOne.y=PSInput.TextureCoord0.y;
cfPointOne.w=PSInput.TextureCoord0.y;
}
if(cfPointOne.z < PSInput.TextureCoord0.x)
{
cfPointOne.z=PSInput.TextureCoord0.x;
cfPointTwo.z=PSInput.TextureCoord0.x;
}
if(cfPointTwo.y < PSInput.TextureCoord0.y)
{
cfPointTwo.y=PSInput.TextureCoord0.y;
cfPointTwo.w=PSInput.TextureCoord0.y;
}
cfPointOne.x=p4One.x;
}
PSOutput.Output = TextureColor;
return PSOutput;
}