2011-07-23 8 views
0

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

ページの下部にあるコードのコードは同一で、コンパイルされますが、デバッグではアクセス違反が発生します。誰でも私がそれが正しく動作するために必要なことを私に見せてもらえますか?

ありがとうございました。

答えて

1

エラーチェックが全くないので、そのサイトは非常に悪いです。 HRESULT を返すすべてのdirectX呼び出しには、エラーがないかどうかを確認する必要があります(MUST)。 S_OKを返した場合はすべてOKです。マニュアルを確認し、EVERY directXの戻り値を確認してください。

あなたのシェーダにはおそらくエラーがあり、コンパイルに失敗するため、おそらくCreateVertexShaderにNULLポインタを渡します。

まず、このどこかに置く(あなたがそれらのすべてが含まれており、このためのLIBS必要はありませんが、私はこれが機能するために必須であるかわからない):ここでは

は、私はエラーをチェックする方法です:

#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コールが(すべての*呼び出しやcompile_shader_from_fileコールを作成します)、これを行うために:

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

ノート "HR(" begginingとOBのを非常に別の ")"の最後の部分です。この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(ピクセルシェーダ)などを選択します。