トップページ > 過去ログ > 記事閲覧
3D描画でティアリングが起きる
名前:eel 日時: 2010/12/14 03:56

GrawGraphのような2D画像を描画した部分には発生せず、DrawModelを利用した3D描画の部分に発生します。 この現象は、フルスクリーン時限定のようです。 参考になるか分かりませんが、DxLib_Init前後で行っている設定を全てコピペしておきます。 SetGraphDisplayArea( 0, 0, 800, 480 ); // ScreenFlip時に表画面全体に転送する裏画面の領域を設定する SetGraphMode( 800, 600, GetColorBitDepth() ); // 解像度指定 SetOutApplicationLogValidFlag( FALSE ); // ログファイルを出力しない SetUseDivGraphFlag( FALSE ); // テクスチャ画像の分割処理を行わない SetWaitVSyncFlag( CConfig::vsync ); // 垂直同期信号待ち SetAlwaysRunFlag( TRUE ); // バックグラウンド時も動作する if( DxLib_Init() == -1 ) { exit( -1 ); } // 初期化後設定 SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); // 画面モード変更時にグラフィックハンドルをリセットしない SetDrawScreen( DX_SCREEN_BACK ); // 描画先画面をバックバッファにセット SetDrawMode( DX_DRAWMODE_BILINEAR ); // なめらかな補間を有効にする SetUseZBuffer3D( TRUE ); // Zバッファを有効にする SetWriteZBuffer3D( TRUE ); // Zバッファへの書き込みを有効にする SetTransColor( 0, 0, 0 ); // RGB(0, 0, 0)を透過する SetDraw3DScale( 480.0f / 600.0f ); // 3D描画のスケールをセットする SetDrawArea( 0, 0, 800, 480 ); SetCameraScreenCenter( 800 / 2, 480 / 2 ); // 画面の消失点をスクリーン上の中央に設定 800 * 480という特殊な環境でフルスクリーンにしていること、SetDraw3DScaleを使用していることに何かヒントがあるのではないかと睨んでいますが、正確なところが分かりません。 お忙しいところ申し訳ありませんが、原因探求をお願いします。

Page: 1 |

Re: 3D描画でティアリングが起きる ( No.1 )
名前:eel 日時:2010/12/14 03:57

SetWaitVSyncFlag( CConfig::vsync ); の部分は変数で、その前でTRUEを代入しているため、 SetWaitVSyncFlag( TRUE ); と同義です。編集なしに貼りつけてしまい申し訳ないですorz
Re: 3D描画でティアリングが起きる ( No.2 )
名前:いっち 日時:2010/12/14 22:56

FPSはどんな感じになるのでしょうか?
Re: 3D描画でティアリングが起きる ( No.3 )
名前:eel 日時:2010/12/15 04:55

>>いっちさん FPSは計測してみたところぴったり60です。 特にScreenFlip以外の処理は行っていないため、モニタのリフレッシュレートが60なのだと思います。
Re: 3D描画でティアリングが起きる ( No.4 )
名前:いっち 日時:2010/12/15 12:42

なんらかの設定(ウィンドウモードの切り替え等)をすると SetDrawScreen の設定がデフォルト(DX_SCREEN_FRONT)に戻ることがあります。 その状態で ScreenFlip をおこなうと画面にちらつきが出ます。 SetDrawScreen を行う位置を変えてみるか、GetActiveGraph で描画対象となっているグラフィックハンドルをチェックしてみて下さい。
Re: 3D描画でティアリングが起きる ( No.5 )
名前:eel 日時:2010/12/15 20:59

SetDrawScreen( DX_SCREEN_BACK );を最後にしてみましたが、今度は3Dの消失点の設定などが失われてしまいました。 また、ティアリングの症状としてはチラツキが出るわけではなく、カメラを移動させると画面の上から4分の1くらいのところに画面が切れたような線が出る(そこから上がズレて描画される)感じです。
Re: 3D描画でティアリングが起きる ( No.6 )
名前:いっち 日時:2010/12/15 21:41

となりますと、今のところ私では原因が分かりません。 開発環境の情報、事象発生時のLog.txt、事象の再現するソースコードをご提供頂けますでしょうか? (ディスプレイが特殊なようなのでディスプレイの型番などもあるとよいかも知れません)
Re: 3D描画でティアリングが起きる ( No.7 )
名前:eel 日時:2010/12/16 05:12

すみません、私の説明が下手で誤解を招いてしまったようです。 フルスクリーンにしたいゲームの解像度が800*480で、モニタは1920*1080の一般的なワイドディスプレイです。 以下がログデータです。 0:システムの情報を出力します 0: DXライブラリ Ver3.04c 2: 論理プロセッサの数 : 2 3: OS Windows7 ( Build 7600 ) 119: CPU動作速度:大体2.53GHz 120: MMX命令を使用します 121: SSE命令が使用可能です 122: SSE2命令が使用可能です 123: CPUベンダ:GenuineIntel 127: CPU名:Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz 128:COMの初期化... 成功しました 133:メモリ総量:2302.36MB 空きメモリ領域:803.13MB 134:タイマーの精度を検査します 135:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 136: パフォーマンスカウンターを使用します タイマー分解能 : 2473.984000 KHz 138: ソフトの二重起動検査... 二重起動はされていませんでした 141:ウインドウクラスを登録します... 登録に成功しました 143:ウインドウモード起動用のウインドウを作成します 159:ウインドウの作成に成功しました 179:IMEを無効にしました 192:ウインドウスタイルをウインドウモード用に変更します... 完了 197:DirectInput関係初期化処理 199: DirectInput7 の取得中... 成功 213: 引き続き初期化処理... 初期化成功 217: ジョイパッドの初期化... 227: 入力装置を見つけました 230: デバイスの登録名:PSX/USB converter 231: デバイスの製品登録名:PSX/USB converter 242: 周期的エフェクトの作成に失敗しました。 244: ジョイパッドの追加は正常に終了しました 246: ジョイパッドの初期化は正常に終了しました 247: マウスデバイスの初期化... 初期化成功 249: キーボードデバイスの初期化... 初期化成功 253:DirectInput 関連の初期化は正常に終了しました 258:DirectSound の初期化を行います 260:DirectSound インターフェースの取得を行います.... 成功 264:引き続きインターフェースの初期化処理... 成功 493: DirectSound デバイスを列挙します 495: モジュール名: ドライバ記述:プライマリ サウンド ドライバー 497: モジュール名:{0.0.0.00000000}.{688dd86e-b965-4339-81ad-30edd344df9f} ドライバ記述:スピーカー (Realtek High Definition Audio) 498: モジュール名:{0.0.0.00000000}.{dad770ec-1f71-4534-8610-fc053db31514} ドライバ記述:Realtek Digital Output (Realtek High Definition Audio) 499: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 500: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 501: 利用可能サンプリング精度 502: プライマリ 16bit = OK 8bit = OK 503: セカンダリ 16bit = OK 8bit = OK 504: 利用可能チャンネル 506: プライマリ MONO = OK STEREO = OK 507: セカンダリ MONO = OK STEREO = OK 508:DirectSound の初期化は正常に終了しました 511:DirectDraw オブジェクトの取得を行います.... 成功 516:引き続き初期化処理... 初期化に成功しました 552:IDirect3D9Ex オブジェクトを取得します.... 成功 557:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 860:成功 863:Driver:nvd3dum.dll Description:NVIDIA GeForce 9600M GS 864:画面のフォーマットは D3DFMT_X8R8G8B8 です 865:Zバッファのフォーマットは D3DFMT_D16 です 866:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 868:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 869:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 870:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 871:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 902:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 903:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 904:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 906:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 907:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 908:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 909:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 910:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 912:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 927:バックバッファロック転送の時間:871nsec 一時的な描画可能バッファを使用した転送の時間:943nsec 928:バックバッファロックを使用します 930:Zバッファを作成します.... 成功 945:プログラマブルシェーダーを使用します 1007:フォントの初期化を行います 1013:フォントの初期化は正常に終了しました 1016:文字コードバッファの初期化を行います... 完了しました 7644:フォントの初期化を行います 7648:フォントの初期化は正常に終了しました 7747:DirectInput 関連の終了処理... 完了 7781:DirectSound の終了処理は正常に終了しました 7784:ウインドウを閉じようとしています 7792:ウインドウが破棄されようとしています 7794:ソフトを終了する準備が整いました 7808: 7813:Alloc memory dump 7815: Total size:0(0.000kb) Alloc num:0 7818:
Re: 3D描画でティアリングが起きる ( No.8 )
名前:eel 日時:2010/12/17 05:19

さらに追加で気がついたことなのですが、↑のソースでSetGraphMode( 800, 600, GetColorBitDepth() ); でフルスクリーンにすると減色されてしまっている気がします。(体感16bitカラーくらい?) ウインドウモード時は減色されていないのですが、何か原因があるのでしょうか。
Re: 3D描画でティアリングが起きる ( No.9 )
名前:管理人 日時:2010/12/26 18:58

ご返信が遅くなり申し訳ありません いっちさんも仰られていますが、よろしければ件の現象が発生するプログラムをこちらの掲示板に 貼り付けていただけないでしょうか? チラツキが出るというわけではないということですので一般的に言うところのティアリングではないかもしれません > SetDrawScreen( DX_SCREEN_BACK );を最後にしてみましたが、今度は3Dの消失点の設定などが失われてしまいました。 描画先画面を変更すると、カメラ周りの設定がリセットされます > さらに追加で気がついたことなのですが、↑のソースでSetGraphMode( 800, 600, GetColorBitDepth() ); > でフルスクリーンにすると減色されてしまっている気がします。(体感16bitカラーくらい?) DxLib_Init の前に GetColorBitDepth を使用すると、戻り値として必ず 16 が返ってきますので、 SetGraphMode( 800, 600, 16 ); としたことと同じになり、16bitカラー画面になります ウインドウモードではカラービット深度の変更はできないので、起動時にデスクトップ画面が 32bit だった場合は SetGraphMode の第三引数に何を指定しても 32bit カラーの画面が維持されるため、フルスクリーンモードの場合のみ 16bit カラーになります
Re: 3D描画でティアリングが起きる ( No.10 )
名前:eel(解決) 日時:2010/12/27 18:34

#include "DxLib.h" #include <cmath> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetGraphDisplayArea( 0, 0, 800, 480 ); // ScreenFlip時に表画面全体に転送する裏画面の領域を設定する SetGraphMode( 800, 600, 16 ); // 解像度指定 SetOutApplicationLogValidFlag( FALSE ); // ログファイルを出力しない SetUseDivGraphFlag( FALSE ); // テクスチャ画像の分割処理を行わない SetWaitVSyncFlag( TRUE ); // 垂直同期信号待ち SetAlwaysRunFlag( TRUE ); // バックグラウンド時も動作する //ChangeWindowMode( TRUE ); // ウインドウモードに if( DxLib_Init() == -1 ) { exit( -1 ); } // 初期化後設定 SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); // 画面モード変更時にグラフィックハンドルをリセットしない SetDrawScreen( DX_SCREEN_BACK ); // 描画先画面をバックバッファにセット SetDrawMode( DX_DRAWMODE_BILINEAR ); // なめらかな補間を有効にする SetUseZBuffer3D( TRUE ); // Zバッファを有効にする SetWriteZBuffer3D( TRUE ); // Zバッファへの書き込みを有効にする SetTransColor( 0, 0, 0 ); // RGB(0, 0, 0)を透過する SetDraw3DScale( 480.0f / 600.0f ); // 3D描画のスケールをセットする SetDrawArea( 0, 0, 800, 480 ); SetCameraScreenCenter( 800 / 2, 480 / 2 ); // 画面の消失点をスクリーン上の中央に設定 // モデルの読み込み int ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの視線の回転値を初期化 float Roll = 0.0f; SetCameraNearFar( 800.0f, 600.0f ); SetupCamera_Perspective( 7.5f ); // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 左右キーでカメラの回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { Roll -= 10.0f; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { Roll += 10.0f; } SetCameraPositionAndTarget_UpVecY( VGet( Roll, -400.0f, -800.0f ), VGet( Roll, -400.0f, 0.0f ) ) ; // モデルの描画 MV1DrawFrame( ModelHandle, 0 ) ; MV1DrawFrame( ModelHandle, 1 ) ; MV1DrawFrame( ModelHandle, 2 ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } このプログラムで左右キーを押すことでモデルがブレます。 しかし、管理人さんの書き込みを参考にSetGraphModeの部分を32bitカラーになるようにしてみますと解決しました。16bit表示に何か問題があったようです。 お騒がせしました。

Page: 1 |