次の方法で共有


トラブルシューティング (Direct3D 9)

このトピックでは、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 Floating-Point 初期化

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 の以降のリリースで引き続き機能する保証はありません。

Retail Direct3D ランタイム ファイルを使用して実行しているときに、アプリケーションで原因不明のエラーが発生した場合は、デバッグ バージョンに対してテストし、アプリケーションが無効なパラメーターを渡すケースをよく調べてください。 DirectX コントロール パネル アプレットを使用し、必要に応じてデバッグ ランタイムに切り替え、[Break on D3DError] オプションをチェックします。 このオプションを選択すると、アプリケーションのバグが検出されたときにアプリケーションを強制的に停止するために、ランタイムで Windows DebugBreak メソッドが強制的に使用されます。

プログラミングのヒント