エラーチェックが全くないので、そのサイトは非常に悪いです。 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(ピクセルシェーダ)などを選択します。