1

それで、私は今日DirectX11でプログラミングを始めました。私はコーディングの経験が豊富ですが、特にDirectXではないので、いくつかのチュートリアルを見に行きました。すべてが盛り上がり、ウィンドウを初期化し、背景色を設定できましたが、シェーダーを定義してオブジェクトを描画しようとすると、ロード時にクラッシュします。このコードは非常に単純で、何が問題なのかを教えてくれるように、RARに入れました。昨日、NetbeansでOpenGL参照パスを設定しても役に立たないようにするために何時間も試したので、Visual C ++ Express Editionでコーディングしているので、DirectXをそこでも機能させようとはしていません。これが私が現在持っているコードです:http ://www.mediafire.com/?i8w1trkx7c03qts

また、www.dx11.org.uk / 3dcube.htmで提供されているexeをダウンロードして実行し、それが直接Xか何かであるかどうかをテストしました。その結果、「D3D11デバイスの作成に失敗しました」というエラーが表示されます。彼らのコードから、「D3D11CreateDeviceAndSwapChain」コマンドを完了できませんでした。正直なところ、私は何を間違っているのですか/何が起こっているのですか?(そして、NetBeansでdirectXライブラリ参照を設定する方法に関するヘルプは非常に役立ちます)。

4

3 に答える 3

4

わたしにはできる :)

コードをコンパイルするために、いくつかの文字列の L プレフィックスを削除する必要がありました: "shaders.hlsl", "WindowClass","Our First Direct3D Program"

実行可能ファイルと同じパスに .hlsl ファイルがありますか? また、VS からプログラムを起動することはできません。エクスプローラーから .exe を起動する必要があります。ただし、この動作が必要ない場合は、次のようにシェーダーへの絶対パスを設定できます。

D3DX11CompileFromFile("C:\\Users\\Stringer\\Desktop\\DXTest\\shaders.hlsl", ...
D3DX11CompileFromFile("C:\\Users\\Stringer\\Desktop\\DXTest\\shaders.hlsl", ...

編集: また、デバイスまたはデバイス/スワップチェーンを作成するときは、常にD3D11_CREATE_DEVICE_DEBUG デバッグモードで使用してください。これにより、VS 出力ウィンドウに役立つ警告とエラーが出力されます (私の側ではすべて問題ないように見えます)。

    D3D11CreateDeviceAndSwapChain(NULL,
                                  D3D_DRIVER_TYPE_REFERENCE,
                                  NULL,
#ifdef _DEBUG
                                  D3D11_CREATE_DEVICE_DEBUG,
#else
                                  0,
#endif
                                  NULL,
                                  NULL,
                                  D3D11_SDK_VERSION,
                                  &scd,
                                  &swapchain,
                                  &dev,
                                  NULL,
                                  &devcon);

編集2:

また、アプリケーションが失敗する可能性があるすべての場所で、常にエラー コードを確認します。

ID3D10Blob* pErrorBlob = NULL;

HRESULT hr = D3DX11CompileFromFile("C:\\Users\\Stringer\\Desktop\\\\DXTest\\shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, &pErrorBlob, 0);
LPVOID pError = NULL;
if( pErrorBlob )
{
    pError = pErrorBlob->GetBufferPointer();
    // then cast to a char* to see it in the locals window
}
于 2010-08-16T22:54:12.077 に答える
1

同じチュートリアルを使用してまったく同じ問題が発生しました。代わりに、同じチュートリアルの DirectX 9 バージョンを試してみただけで、問題なくすぐに動作しました (文字列の先頭から L 文字を削除する必要があることを除けば、Unicode サポートと関係があります)。この問題の根本的な原因は、一部のシステムで DX11 がサポートされていないことにあるようです。

于 2012-08-21T12:09:37.980 に答える
1

www.directxtutorial.com の DX11 コードは、シェーダーをシェーダー モデル 5 としてコンパイルしようとします。DX 10/10.1 クラスのハードウェアは、いくつかの DX11 機能を利用するように更新されていますが、シェーダー モデル 5 はそれらの 1 つではありません。

変更: D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0); D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);

D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_4_0", 0, 0, 0, &VS, 0, 0); D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_4_0", 0, 0, 0, &PS, 0, 0);

http://en.wikipedia.org/wiki/DirectX#DirectX_11

于 2010-08-27T05:57:10.420 に答える