0

Visual C++ 2010 での C++ に関する知識はほとんどなく、DirectX チュートリアルに従っています。ここまでのすべてを理解するのに十分な知識がありますが、今は HLSL シェーダーを含めようとしています。必要なコンテンツはありますが、HLSL がどのようなファイルである必要があるのか​​ わかりません。ファイルを作成する必要がある形式はありますか? シェーダー コードを .cpp ファイルに入れようとしましたが、CreateVertexShader 関数を使用するとアクセス違反が発生します。ヘッダーファイルに入れましたが、C++ のような HLSL コードを読み取り、構文エラーが発生しました。チュートリアルはこちら: http://www.directxtutorial.com/Tutorial11/BA/BA5.aspx

ページの下部にあるコードのコードは同じで、コンパイルされますが、デバッグでアクセス違反が発生します。適切に実行するために何をする必要があるかを誰かに教えてもらえますか?

ありがとう。

4

1 に答える 1

1

そのサイトは、エラー チェックがまったくないため、非常に悪いものです。HRESULT を返すすべての directX 呼び出しでエラーをチェックする必要がありますS_OK が返された場合、すべて問題ありません。ドキュメントを確認し、すべてのdirectXの戻り値を確認してください。

シェーダーにエラーがあり、コンパイルに失敗する可能性があるため、NULL ポインターを CreateVertexShader に渡す可能性があります。

エラーを確認する方法は次のとおりです。

最初にこれをどこかに置きます(これにはこれらのインクルードとライブラリのすべては必要ありませんが、これが機能するためにどれが必須かはわかりません):

#include <D3D11.h>
#include <DXGI.h>
#include <DxErr.h>
#include <D3D11Shader.h>
#include <D3Dcompiler.h>
#include <D3DX11async.h>

#if defined(_DEBUG)
#pragma comment(lib,"d3dx11d.lib")
#else
#pragma comment(lib,"d3dx11.lib")
#endif

#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"dxgi.lib")
#pragma comment(lib,"DxErr.lib")
#pragma comment(lib,"d3dcompiler.lib")

    #ifndef HR
        #define HR(x){HRESULT hr=x;if(FAILED(hr)){DXTraceW(__FILE__,(DWORD)__LINE__,hr,L#x,true);TRUE;}}
    #endif

ここで、HRESULT を返すすべての directX 呼び出し (すべての Create* 呼び出しまたは compile_shader_from_file 呼び出し) に対して、次のようにします。

HR(device->CreateVertexShader(shaderBlob->GetBufferPointer(),shaderBlob->GetBufferSize(),NULL,&vs));

最初の「HR(」と、最後の「)」に注意してください。この directX 呼び出しが失敗すると、エラー メッセージが表示されます。

シェーダーの場合は、さらにデータを取得して、HLSL コードを記述したときに実際に何を失敗したかを確認する必要があります。これが私がそれを行う方法です:

ID3D10Blob* shaderBlob=NULL;
ID3D10Blob* errorBlob=NULL;

HR(D3DX11CompileFromFileA(fileName.c_str(),macros,NULL,mainFunction.c_str(),shaderModel.c_str(),
    shaderCompileFlags,0,NULL,&shaderBlob,&errorBlob,NULL)); 

if(errorBlob)
{
    char* es=reinterpret_cast<char*>(errorBlob->GetBufferPointer());
        NXMsg("ERROR",es);// Shows error message box
    errorBlob->Release();
    return NULL;
}

HLSL コードを含むファイルの形式は関係ありません。通常、.hlsl、.vs (頂点シェーダー)、.ps (ピクセル シェーダー) などを選択します。

于 2011-07-23T08:46:12.210 に答える