このトピックでは、Direct3D アプリケーションを作成するときに発生する可能性がある問題の一般的なカテゴリと、それらを防ぐ方法を示します。
デバイスの作成
デバイスの作成時にアプリケーションが失敗した場合は、次の一般的なエラーを確認してください。
- デバイスの機能(特にレンダー深度)を確認してください。
- エラー コードを確認します。 D3DERR_OUTOFVIDEOMEMORYは常に起こり得ます。
- デバッグ DirectX ダイナミック リンク ライブラリ (DLL) を使用し、デバッガーの下で出力メッセージを確認します。
ライティングされた頂点を使用する
点灯した頂点を使用するアプリケーションでは、D3DRS_LIGHTINGレンダリング状態を FALSE 設定することで、Direct3D 照明エンジンを無効にする必要があります。 既定では、ライティングが有効になっている場合、入力頂点に 0 以外の色値が含まれている場合でも、法線ベクトルを含まない頂点の色が 0 (黒) に設定されます。 照明された頂点には頂点法線が含まれていないため、照明エンジンが有効になっている場合、Direct3D に渡される色情報はレンダリング中に失われます。
明らかに、頂点の色は、独自の照明を実行するアプリケーションにとって重要です。 システムが既定値を適用しないようにするには、D3DRS_LIGHTINGを FALSE 設定してください。
アプリケーションが実行されていても何も表示されない場合は、次の一般的なエラーを確認してください。
- 三角形が縮退しないようにします。
- 三角形がカリングされていないことを確認します。
- 変換が内部的に一貫性があることを確認します。
- ビューポートの設定を確認して、三角形を表示できることを確認します。
デバッグ
Direct3D アプリケーションのデバッグは困難な場合があります。 すべての戻り値を確認するだけでなく、次の手法を試してください。これは、非常に異なるハードウェア実装に依存する Direct3D プログラミングにおける特に重要なアドバイスです。
- デバッグ DLL に切り替えなさい。
- ソフトウェアのみのデバイスを強制的に使用し、使用可能な場合でもハードウェア アクセラレーションをオフにします。
- システム メモリにサーフェスを格納するように強制します。
- 統合デバッガーを使用できるように、ウィンドウで実行するオプションを作成します。
この一覧の 2 番目と 3 番目のオプションは、Win16 ロックを回避するのに役立ちます。そうしないと、デバッガーがハングする可能性があります。
また、次のエントリを Win.iniに追加してみてください。
[Direct3D]
debug=3
[DirectDraw]
debug=3
ボーランド浮動小数点の初期化
Borland のコンパイラは、Direct3D と互換性のない方法で浮動小数点例外を報告します。 この問題を解決するには、次のような_matherr例外ハンドラーを含めます。
// Borland floating point initialization
#include <math.h>
#include <float.h>
void initfp(void)
{
// Disable floating point exceptions
_control87(MCW_EM,MCW_EM);
}
int _matherr(struct _exception *e)
{
e; // Dummy reference to catch the warning
return 1; // Error has been handled
}
パラメーターの検証
パフォーマンス上の理由から、Direct3D イミディエイト モードのランタイムのデバッグ バージョンでは、リテール バージョンよりも多くのパラメーター検証が実行され、検証がまったく実行されない場合があります。 これにより、パフォーマンス チューニングと最終リリースに高速のリテール バージョンを使用する前に、アプリケーションでデバッグランタイムの速度が遅いコンポーネントを使用して堅牢なデバッグを実行できます。
いくつかの Direct3D イミディエイト モード メソッドでは、受け入れ可能な値に制限が課されますが、多くの場合、これらの制限は、Direct3D イミディエイト モードの実行時のデバッグ バージョンによってのみチェックおよび適用されます。 アプリケーションはこれらの制限に準拠している必要があります。または、Direct3D の製品版で実行すると、予期しない望ましくない結果が発生する可能性があります。 たとえば、IDirect3DDevice9::D rawPrimitive メソッドは、メソッドがレンダリングするプリミティブの数を示すパラメーター (PrimitiveCount) を受け取ります。 このメソッドは、0 ~ D3DMAXNUMPRIMITIVESの値のみを受け取ることができます。 Direct3D のデバッグ バージョンでは、D3DMAXNUMPRIMITIVES以上のプリミティブを渡すと、メソッドは正常に失敗し、エラー メッセージがエラー ログに出力され、エラー値がアプリケーションに返されます。 逆に、アプリケーションが製品版の実行時に同じエラーを発生させる場合、動作は未定義です。 パフォーマンス上の理由から、メソッドはパラメーターを検証しないため、無効な場合は予期しない完全な状況動作が発生します。 呼び出しが機能する場合もあれば、Direct3D でメモリ エラーが発生する場合もあります。 無効な呼び出しが特定のハードウェア構成と DirectX バージョンで一貫して機能する場合、他のハードウェアまたは DirectX の以降のリリースで引き続き機能する保証はありません。
リテール版の Direct3D ランタイム ファイルを使用して実行しているときに、アプリケーションで原因不明のエラーが発生した場合は、デバッグ バージョンに対してテストし、アプリケーションが無効なパラメーターを渡す場合をよく調べてください。 DirectX コントロール パネル アプレットを使用し、必要に応じてデバッグ ランタイムに切り替えて、[D3DError で中断] オプションをオンにします。 このオプションにより、アプリケーションのバグが検出されたときにアプリケーションを強制的に停止させるために、ランタイムは Windows DebugBreak メソッドを使用するように強制されます。
関連トピック