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
|
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
なるほど、納得しました。
解説ありがとうございました。
|