トップページ > 過去ログ > 記事閲覧
DrawPrimitive2DToShaderについて
名前:sy(サイ) 日時: 2012/03/10 15:08

DrawPrimitive2DToShaderを使用して、 640*480の画像を640*480の画面いっぱいに描画しようと思ったのですが、うまくいきません。 少し前のバージョンでは、問題なかったので3.07aでうまくいく方法が知りたいです。 /* ここからソース概要 */ int grhandle ; int pshandle = LoadPixelShader( "/* しぇーだーふぁいる名 */.pso" ) ; int OFF_SCREEN; int screensofthandle = MakeARGB8ColorSoftImage( 640, 480 ) ; // オフスクリーン作成 { SetDrawValidGraphCreateFlag( TRUE ); OFF_SCREEN = MakeGraph( 640, 480 ) ; SetDrawValidGraphCreateFlag( FALSE ); } // 頂点データの準備 VERTEX2DSHADER Vert[6] ; { Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 1 ].pos = VGet( 1024.0f, 0.0f, 0.0f ) ; Vert[ 2 ].pos = VGet( 0.0f, 512.0f, 0.0f ) ; Vert[ 3 ].pos = VGet( 1024.0f, 512.0f, 0.0f ) ; Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ; float aspect_u = 1.0f; float aspect_v = 1.0f; Vert[ 0 ].u = Vert[ 0 ].su = 0.0f * aspect_u ; Vert[ 0 ].v = Vert[ 0 ].sv = 0.0f * aspect_v ; Vert[ 1 ].u = Vert[ 1 ].su = 1.0f * aspect_u ; Vert[ 1 ].v = Vert[ 1 ].sv = 0.0f * aspect_v ; Vert[ 2 ].u = Vert[ 2 ].su = 0.0f * aspect_u ; Vert[ 2 ].v = Vert[ 2 ].sv = 1.0f * aspect_v ; Vert[ 3 ].u = Vert[ 3 ].su = 1.0f * aspect_u ; Vert[ 3 ].v = Vert[ 3 ].sv = 1.0f * aspect_v ; Vert[ 0 ].rhw = Vert[ 1 ].rhw = Vert[ 2 ].rhw = Vert[ 3 ].rhw = 1.0f ; Vert[ 4 ] = Vert[ 2 ] ; Vert[ 5 ] = Vert[ 1 ] ; } //============================================== // ポストエフェクト描画 //============================================== // 裏画面への描画結果をscreensofthandleに取得 GetDrawScreenSoftImage( 0, 0, 640, 480, screensofthandle ) ; grhandle = CreateGraphFromSoftImage( screensofthandle ) ; // 使用するテクスチャをセット SetUseTextureToShader( 0, grhandle ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // 指定の名前を持つ定数が使用するシェーダー定数の番号を取得する int cindex = GetConstIndexToShader( "TextureSize", pshandle ); FLOAT4 f4 = { 1024.f, 512.f, 1.f, 1.f }; int c = SetPSConstF(cindex, f4); // 描画 DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ; DeleteGraph( grhandle ) ; これで描画結果は横幅が2倍になってしまい、画面左半分が二倍に引き伸ばされて描画されます。 よろしくお願いします。

Page: 1 |

Re: DrawPrimitive2DToShaderについて ( No.1 )
名前:管理人 日時:2012/03/11 03:07

DrawPrimitive 系の関数は2のn乗サイズの画像以外を使用すると意図した結果を得ることができません というのも 640x480のサイズを持つソフトウエアイメージを使用して CreateGraphFromSoftImage を 実行した場合は、ライブラリ内部で「テクスチャを分割した方がメモリ効率が良い」と判断されて 512x512、128x512 の2枚のテクスチャが作成されるからです DrawGraph などの関数では内部でこの二枚のテクスチャを使用して 640x480 の画像を描画するのですが、 DrawPrimitive 系のポリゴンを直接描画する関数ではその処理が行われないので、結果として 512x512 と 128x512 の二つのテクスチャのうちの 512x512 の方が 1024x512 の領域に描画されることになります ( 横方向に2倍になったのはこのためです ) 画像を分割して読み込むかどうかを設定するための関数 SetUseDivGraphFlag に FALSE を渡して呼び出した後 画像作成関数を使用するとハードウエアの性能が許す限り分割を行わないでテクスチャを作成しますので、 これを CreateGraphFromSoftImage を呼び出す前に使えば意図した結果が得られると思います // 必要ならグラフィックの分割を行うかのフラグをセットする( Flag TRUE:必要なら分割する FALSE:分割しない ) int SetUseDivGraphFlag( int Flag ) ; よろしければお使いください
Re: DrawPrimitive2DToShaderについて ( No.2 )
名前:sy(サイ) 日時:2012/03/11 08:28

SetUseDivGraphFlagで意図した通りに動きました。有難うございました^^

Page: 1 |