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表示に何か問題があったようです。
お騒がせしました。
|