トップページ > 過去ログ > 記事閲覧
大きな画像にシェーダを利用したい
名前:ichi 日時: 2011/01/06 14:45

プログラムの引数に画像とpsoファイルを指定してJPEGファイルとして出力したいと思い、 以下のようなプログラムを書きました。 しかし、このプログラムでは(僕の環境では)1024*512を超えるサイズの画像を読み込むと、 出力される画像が真っ黒になってしまいます。 横と縦どちらかが1でも超えると駄目です。 原因か解決策が解る方がいらしましたら、ぜひ教えてください。 以下ソースコード #include "DxLib.h" int main(int argc, char *argv[]){ int grhandle, pshandle,GraphHandle; int width, height, sizeX, sizeY; VERTEX2DSHADER Vert[ 6 ] ; if(argv[1]==NULL) return -1; if(argv[2]==NULL) return -1; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み grhandle = LoadGraph(argv[1]); //引数から画像を読み込み GetGraphSize( grhandle , &width , &height ) ; //画像のサイズ取得 sizeX=1; //width以上で最小の2^n取得 while(sizeX<width){ sizeX*=2; } //height以上で最小の2^n取得 sizeY=1; while(sizeY<height){ sizeY*=2; } SetDrawValidGraphCreateFlag( TRUE ) ; // 描画可能画像を作成する指定 GraphHandle = MakeGraph(sizeX, sizeY) ; // 描画可能画像の作成 SetDrawValidGraphCreateFlag( FALSE ) ; // 描画可能画像は制約が多いので直ぐ戻す SetDrawScreen(GraphHandle) ; //描画先を描画可能画像に DrawGraph(0,0,grhandle,FALSE); //引数の画像貼り付け pshandle = LoadPixelShader(argv[2]) ; //引数からPSOファイル読み込み // 頂点データの準備 Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 1 ].pos = VGet( (float)sizeX, 0.0f, 0.0f ) ; Vert[ 2 ].pos = VGet( 0.0f, (float)sizeY, 0.0f ) ; Vert[ 3 ].pos = VGet( (float)sizeX, (float)sizeY, 0.0f ) ; Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ; Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ; Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ; Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ; Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ; Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ; Vert[ 0 ].rhw = 1.0f ; Vert[ 1 ].rhw = 1.0f ; Vert[ 2 ].rhw = 1.0f ; Vert[ 3 ].rhw = 1.0f ; Vert[ 4 ] = Vert[ 2 ] ; Vert[ 5 ] = Vert[ 1 ] ; // 使用するテクスチャをセット SetUseTextureToShader( 0, GraphHandle ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // 描画 DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ; SaveDrawScreenToJPEG(0, 0, width, height, "output.jpg", 90); //描画先(GraphHandle)をJPGとして保存 // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Page: 1 |

Re: 大きな画像にシェーダを利用したい ( No.1 )
名前:いっち 日時:2011/01/06 23:11

ピクセルシェーダーを利用しない場合はうまくいくのでしょうか?
Re: 大きな画像にシェーダを利用したい ( No.2 )
名前:ichi 日時:2011/01/06 23:39

試してみたところピクセルシェーダーを使わない場合でも、1024*512を超えるサイズの画像の出力で真っ黒になってしまいました。 また、通常の描画をDXライブラリのウィンドウで確認したところ、ピクセルシェーダーを用いない場合の画面に映る分の表示は確認できましたが、 ピクセルシェーダーを用いた場合は画面内の部分も描画されていませんでした。
Re: 大きな画像にシェーダを利用したい ( No.3 )
名前:いっち 日時:2011/01/06 23:49

事象発生時のLog.txtをご提供頂けますか?
Re: 大きな画像にシェーダを利用したい ( No.4 )
名前:ichi 日時:2011/01/07 00:28

失敗時(画像サイズが大きい時)のものです。 0:システムの情報を出力します 1: DXライブラリ Ver3.04d 2: 論理プロセッサの数 : 2 2: OS WindowsXP ( Build 2600 Service Pack 3 ) 102: CPU動作速度:大体2.94GHz 102: MMX命令を使用します 103: SSE命令が使用可能です 103: SSE2命令が使用可能です 103: CPUベンダ:GenuineIntel 104: CPU名:Intel(R) Core(TM)2 CPU X6800 @ 2.93GHz 106:COMの初期化... 成功しました 109:メモリ総量:2047.04MB 空きメモリ領域:602.22MB 110:タイマーの精度を検査します 110:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 110: パフォーマンスカウンターを使用します タイマー分解能 : 2938410.000000 KHz 111: ソフトの二重起動検査... 二重起動はされていませんでした 112:ウインドウクラスを登録します... 登録に成功しました 112:ウインドウモード起動用のウインドウを作成します 121:ウインドウの作成に成功しました 138:IMEを無効にしました 201:ウインドウスタイルをウインドウモード用に変更します... 完了 202:DirectInput関係初期化処理 203: DirectInput7 の取得中... 成功 244: 引き続き初期化処理... 初期化成功 247: ジョイパッドの初期化... 265: 入力装置を見つけました 267: デバイスの登録名:USB Gamepad 267: デバイスの製品登録名:USB Gamepad 268: 周期的エフェクトの作成に失敗しました。 269: ジョイパッドの追加は正常に終了しました 269: ジョイパッドの初期化は正常に終了しました 270: マウスデバイスの初期化... 初期化成功 271: キーボードデバイスの初期化... 初期化成功 279:DirectInput 関連の初期化は正常に終了しました 280:DirectSound の初期化を行います 280:DirectSound インターフェースの取得を行います.... 成功 296:引き続きインターフェースの初期化処理... 成功 400: DirectSound デバイスを列挙します 401: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 401: モジュール名: ctaud2k.sys ドライバ記述:SB X-Fi Audio [9C00] 402: 最大サンプリングレート:192.00KHz 最小サンプリングレート:0.00KHz 402: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 402: 利用可能サンプリング精度 403: プライマリ 16bit = OK 8bit = OK 403: セカンダリ 16bit = OK 8bit = OK 403: 利用可能チャンネル 403: プライマリ MONO = OK STEREO = OK 404: セカンダリ MONO = OK STEREO = OK 405:DirectSound の初期化は正常に終了しました 406:DirectDraw オブジェクトの取得を行います.... 成功 458:引き続き初期化処理... 初期化に成功しました 460:IDirect3D9Ex オブジェクトを取得します.... IDirect3D9 オブジェクトを取得します.... 成功 473:IDirect3DDevice9 オブジェクトを取得します.... ハードウエア頂点演算を使用します 764:成功 765:Driver:nv4_disp.dll Description:NVIDIA GeForce 8800 GTS 766:画面のフォーマットは D3DFMT_X8R8G8B8 です 766:Zバッファのフォーマットは D3DFMT_D16 です 766:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 766:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 767:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 767:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 767:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 768:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 768:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 768:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 769:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 769:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 769:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 769:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 770:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 770:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 784:バックバッファロック転送の時間:320nsec 一時的な描画可能バッファを使用した転送の時間:5096nsec 785:バックバッファロックを使用します 785:Zバッファを作成します.... 成功 798:プログラマブルシェーダーを使用します 864:フォントの初期化を行います 886:フォントの初期化は正常に終了しました 887:文字コードバッファの初期化を行います... 完了しました 996:フォントの初期化を行います 999:フォントの初期化は正常に終了しました 1034:DirectInput 関連の終了処理... 完了 1041:DirectSound の終了処理は正常に終了しました 1042:ウインドウを閉じようとしています 1107:ウインドウが破棄されようとしています 1107:ソフトを終了する準備が整いました 1108: 1108:Alloc memory dump 1109: Total size:0(0.000kb) Alloc num:0 1109: 以下は正常に動いた時のものです(画像サイズが小さい) 1:システムの情報を出力します 1: DXライブラリ Ver3.04d 1: 論理プロセッサの数 : 2 2: OS WindowsXP ( Build 2600 Service Pack 3 ) 102: CPU動作速度:大体2.91GHz 102: MMX命令を使用します 102: SSE命令が使用可能です 103: SSE2命令が使用可能です 103: CPUベンダ:GenuineIntel 104: CPU名:Intel(R) Core(TM)2 CPU X6800 @ 2.93GHz 105:COMの初期化... 成功しました 108:メモリ総量:2047.04MB 空きメモリ領域:628.25MB 109:タイマーの精度を検査します 109:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 109: パフォーマンスカウンターを使用します タイマー分解能 : 2938410.000000 KHz 110: ソフトの二重起動検査... 二重起動はされていませんでした 111:ウインドウクラスを登録します... 登録に成功しました 111:ウインドウモード起動用のウインドウを作成します 119:ウインドウの作成に成功しました 138:IMEを無効にしました 200:ウインドウスタイルをウインドウモード用に変更します... 完了 201:DirectInput関係初期化処理 201: DirectInput7 の取得中... 成功 209: 引き続き初期化処理... 初期化成功 211: ジョイパッドの初期化... 216: 入力装置を見つけました 218: デバイスの登録名:USB Gamepad 219: デバイスの製品登録名:USB Gamepad 219: 周期的エフェクトの作成に失敗しました。 220: ジョイパッドの追加は正常に終了しました 220: ジョイパッドの初期化は正常に終了しました 221: マウスデバイスの初期化... 初期化成功 221: キーボードデバイスの初期化... 初期化成功 222:DirectInput 関連の初期化は正常に終了しました 223:DirectSound の初期化を行います 223:DirectSound インターフェースの取得を行います.... 成功 224:引き続きインターフェースの初期化処理... 成功 276: DirectSound デバイスを列挙します 277: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 277: モジュール名: ctaud2k.sys ドライバ記述:SB X-Fi Audio [9C00] 277: 最大サンプリングレート:192.00KHz 最小サンプリングレート:0.00KHz 278: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 278: 利用可能サンプリング精度 278: プライマリ 16bit = OK 8bit = OK 279: セカンダリ 16bit = OK 8bit = OK 279: 利用可能チャンネル 279: プライマリ MONO = OK STEREO = OK 279: セカンダリ MONO = OK STEREO = OK 279:DirectSound の初期化は正常に終了しました 280:DirectDraw オブジェクトの取得を行います.... 成功 282:引き続き初期化処理... 初期化に成功しました 283:IDirect3D9Ex オブジェクトを取得します.... IDirect3D9 オブジェクトを取得します.... 成功 296:IDirect3DDevice9 オブジェクトを取得します.... ハードウエア頂点演算を使用します 584:成功 585:Driver:nv4_disp.dll Description:NVIDIA GeForce 8800 GTS 585:画面のフォーマットは D3DFMT_X8R8G8B8 です 586:Zバッファのフォーマットは D3DFMT_D16 です 586:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 586:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 587:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 587:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 587:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 587:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 588:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 588:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 588:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 589:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 589:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 589:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 589:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 590:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 600:バックバッファロック転送の時間:415nsec 一時的な描画可能バッファを使用した転送の時間:1104nsec 600:バックバッファロックを使用します 600:Zバッファを作成します.... 成功 611:プログラマブルシェーダーを使用します 675:フォントの初期化を行います 677:フォントの初期化は正常に終了しました 677:文字コードバッファの初期化を行います... 完了しました 721:フォントの初期化を行います 724:フォントの初期化は正常に終了しました 732:DirectInput 関連の終了処理... 完了 737:DirectSound の終了処理は正常に終了しました 737:ウインドウを閉じようとしています 801:ウインドウが破棄されようとしています 801:ソフトを終了する準備が整いました 802: 802:Alloc memory dump 803: Total size:0(0.000kb) Alloc num:0 803: 注意 00:28 訂正しました
Re: 大きな画像にシェーダを利用したい ( No.5 )
名前:いっち 日時:2011/01/08 16:37

Log.txtのご提供ありがとうございます。 私が見る限り特に問題は見当たりませんが他の方からのご指摘があるかもしれません。 スレッドトップのソースを元に DrawPrimitive2D を使って私の環境でテストしてみましたが、 比較的大きな画像(2048x2048)を使用した場合も問題なく保存できているように見受けられました。 (シェーダーを利用した場合のテストはしていません) テストをしてみて思ったのですが、書き込み元となるテクスチャと書き込み先となるテクスチャが同一になっていますが、 これは問題ないのでしょうか?(私の環境では事象が発生しないので問題無さそうですが・・・) //- 以下、テストコード-// #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; int gh = LoadGraph( "bigpic.bmp" ); int width, height, sizeX, sizeY; GetGraphSize( gh, &width, &height ); for ( sizeX = 1; sizeX < width; sizeX *= 2 ) ; for ( sizeY = 1; sizeY < height; sizeY *= 2 ) ; SetDrawValidGraphCreateFlag( TRUE ); int mgh = MakeGraph( sizeX, sizeY ); SetDrawValidGraphCreateFlag( FALSE ); SetDrawScreen( mgh ); DrawGraph( 0, 0, gh, FALSE ); VERTEX2D Vert[6]; Vert[0].pos = VGet( 0.0f, 0.0f, 0.0f ); Vert[1].pos = VGet( (float)sizeX, 0.0f, 0.0f ); Vert[2].pos = VGet( 0.0f, (float)sizeY, 0.0f ); Vert[3].pos = VGet( (float)sizeX, (float)sizeY, 0.0f ); Vert[0].dif = Vert[1].dif = Vert[2].dif = Vert[3].dif = GetColorU8( 255, 255, 255, 255 ); Vert[0].u = 0.0f; Vert[0].v = 0.0f; Vert[1].u = 1.0f; Vert[1].v = 0.0f; Vert[2].u = 0.0f; Vert[2].v = 1.0f; Vert[3].u = 1.0f; Vert[3].v = 1.0f; Vert[0].rhw = Vert[1].rhw = Vert[2].rhw = Vert[3].rhw = 1.0f; Vert[4] = Vert[2]; Vert[5] = Vert[1]; DrawPrimitive2D( Vert, 6, DX_PRIMTYPE_TRIANGLELIST, mgh, TRUE ); SaveDrawScreenToJPEG( 0, 0, width, height, "output.jpg", 90 ); DxLib_End( ); return 0; }
Re: 大きな画像にシェーダを利用したい ( No.6 )
名前:管理人 日時:2011/01/08 20:32

いっちさんも仰られていますが、描画元の画像と描画先の画像が同じ場合に正常に 動作するのかどうかの確認はできませんでしたので( 私の環境でも正常な結果が得られてしまいましたが、原理的には正常に動作しないはず ) よろしければとりあえず試しに // 使用するテクスチャをセット SetUseTextureToShader( 0, GraphHandle ) ; こちらで設定する画像と描画先の画像を別のハンドルにするというのを試してみていただけないでしょうか? ( MakeGraph で二つ同じサイズの画像を用意して片方を読み込んだ画像を DrawGraph で書き込む先と SetUseTextureToShader に設定する用に、片方を DrawPrimitive2DToShader の描画結果を書き込む先に使う )
Re: 大きな画像にシェーダを利用したい ( No.7 )
名前:ichi 日時:2011/01/09 14:54

いっちさんのコードでコンパイル、実行した場合も僕の環境では大きな画像の保存ができませんでした。(小さい場合は正常に動作しました。) また、管理人さんの言うとおり別のイメージハンドルを指定して描画しても画像が真っ黒になってしまいました。 (やはり、小さい画像では正常に動きました。DX_SCREEN_FRONTを指定して描画した場合も大きいと想定通りに描画されず、真っ黒でした。)
Re: 大きな画像にシェーダを利用したい ( No.8 )
名前:いっち 日時:2011/01/09 20:03

うーん、わからないです。 ハードウェアの限界っぽい挙動ではあるのですが、私のグラボより良いグラボなんですよね・・・。 とりあえず、以下のようなコードだとどの様な結果になるか教えて頂けますでしょうか? (width と height の値を変えてみてください。) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; int width = 1024, height = 1024; SetDrawValidGraphCreateFlag( TRUE ); int mgh = MakeGraph( width, height ); SetDrawValidGraphCreateFlag( FALSE ); FillGraph( mgh, 255, 0, 0 ); SetDrawScreen( mgh ); SaveDrawScreenToJPEG( 0, 0, width, height, "output.jpg", 90 ); DxLib_End( ); return 0; }
Re: 大きな画像にシェーダを利用したい ( No.9 )
名前:ichi 日時:2011/01/09 20:35

真っ赤な画像が出力されました 現実的な範囲で値を増やしても(4096*4096など)とくに問題は発生しませんでした
Re: 大きな画像にシェーダを利用したい ( No.10 )
名前:いっち 日時:2011/01/09 21:01

と、なるとあやしいのは DrawPrimitive2D でしょうか? 以下のコードをテストして頂けますか? #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; int width = 1024, height = 1024; SetDrawValidGraphCreateFlag( TRUE ); int mgh = MakeGraph( width, height ); SetDrawValidGraphCreateFlag( FALSE ); FillGraph( mgh, 255, 0, 0 ); SetDrawScreen( mgh ); VERTEX2D Vert[6]; Vert[0].pos = VGet( 10.0f, 0.0f, 0.0f ); Vert[1].pos = VGet( (float)width, 0.0f, 0.0f ); Vert[2].pos = VGet( 10.0f, (float)height, 0.0f ); Vert[3].pos = VGet( (float)width, (float)height, 0.0f ); Vert[0].dif = Vert[1].dif = Vert[2].dif = Vert[3].dif = GetColorU8( 0, 0, 255, 255 ); Vert[0].u = 0.0f; Vert[0].v = 0.0f; Vert[1].u = 1.0f; Vert[1].v = 0.0f; Vert[2].u = 0.0f; Vert[2].v = 1.0f; Vert[3].u = 1.0f; Vert[3].v = 1.0f; Vert[0].rhw = Vert[1].rhw = Vert[2].rhw = Vert[3].rhw = 1.0f; Vert[4] = Vert[2]; Vert[5] = Vert[1]; DrawPrimitive2D( Vert, 6, DX_PRIMTYPE_TRIANGLELIST, DX_NONE_GRAPH, TRUE ); SaveDrawScreenToJPEG( 0, 0, width, height, "output.jpg", 90 ); DxLib_End( ); return 0; }
Re: 大きな画像にシェーダを利用したい ( No.11 )
名前:ichi 日時:2011/01/09 21:04

しぇーだーを使ったプログラムで log.txtには出力されていませんでしたが、VC++のデバッグ出力には以下のものが出力されていました。 確認してみたところ、サイズを小さくするとこのエラーは出力されませんでした。 Direct3D9: (ERROR) :DepthStencil Buffer must be at least as big as the RenderTarget. test.exe の 0x7c812afb で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012faf8)。 Direct3D9: (ERROR) :DrawPrimitiveUP failed.
Re: 大きな画像にシェーダを利用したい ( No.12 )
名前:ichi 日時:2011/01/09 21:03

>>10 のコードでは赤い画像が出力されました。
Re: 大きな画像にシェーダを利用したい ( No.13 )
名前:いっち 日時:2011/01/09 21:06

有用な情報だと思います。 私にはさっぱり分かりませんので、管理人さんの見解をお待ちいただくのが宜しいかと思います。
Re: 大きな画像にシェーダを利用したい ( No.14 )
名前:管理人 日時:2011/01/10 22:13

> Direct3D9: (ERROR) :DepthStencil Buffer must be at least as big as the RenderTarget. > test.exe の 0x7c812afb で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012faf8)。 > Direct3D9: (ERROR) :DrawPrimitiveUP failed. ありがとうございます、こちらはデバッグ版DirectXランタイムを有効にしていると出るエラーです デバッグ版DirectXランタイムを利用することでリテール版(通常版)DirectXランタイムより 厳密な処理を行わないとエラーで発生するようにすることができる(あとDirectXのエラーログを得られる)ことを忘れていました orz これが原因である可能性が高いかもしれません このエラーは画面サイズと同じZバッファを使って画面サイズより大きなテクスチャに対して 描画しようとしたときに発生するエラーです(デバッグ版DirectXランタイムを使用していないと出ないかもしれません) このエラーが発生しないように、応急処置的ですが画面サイズより大きな画像に対して描画処理を行う場合は強制的に Zバッファの機能をOFFにするようにしました このエラーが発生しないようにすることで ichiさんの環境でも大きな画像に対して描画処理を行えるようになるかどうかは わかりませんが、よろしければお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: 大きな画像にシェーダを利用したい ( No.15 )
名前:ichi(解決) 日時:2011/01/10 22:59

迅速な対応ありがとうございます。 自分の環境でも正常に処理できることを確認しました。
Re: 大きな画像にシェーダを利用したい ( No.16 )
名前:いっち 日時:2011/01/11 23:46

DirectX の仕様とのことなので、 今まで(3.04dで)ウィンドウサイズよりも大きな書き込み可能なグラフィックハンドルに対してZバッファを利用した場合に どのようになるのか検証してみました所、たしかにZバッファが無効になっていました。 ただ、ichiさんの事象の場合、もともとZバッファが無効の状態だと思うのですが DrawPrimitive2D では関係ないのでしょうか?
Re: 大きな画像にシェーダを利用したい ( No.17 )
名前:管理人 日時:2011/01/15 21:20

Zバッファは「有効にするかどうか」の設定のほかに「このZバッファを使います」と 使用するZバッファを指定する設定もありまして、今回の原因は「有効にするかどうか」を 「無効」の状態にしていても、「このZバッファを使います」の設定で描画対象となっている 画像(又は画面)よりも小さなZバッファを指定していた場合にエラーが発生してしまうというものでした なので DrawPrimitive2D はZバッファは「無効」ですが、「このZバッファを使用する」の 設定が描画先よりも小さいZバッファが指定されていたままだったためにエラーが発生していました 今回は描画先を SetDrawScreen で変更した際に、新しい描画先が画像(画面)よりも大きかったら 「このZバッファを使用する」の設定に「使用するZバッファは無し」とすることで対処しました
Re: 大きな画像にシェーダを利用したい ( No.18 )
名前:いっち(解決) 日時:2011/01/15 22:48

なるほど、納得しました。 解説ありがとうございました。

Page: 1 |