该网站是非常糟糕的,因为它根本没有任何错误检查。每个directX调用返回HRESULT 必须检查错误。如果它返回S_OK,一切都可以。检查文档,并确保您检查EVERY directX返回值。
您的着色器可能有错误,并且无法编译,所以您可能会传递一个指向CreateVertexShader的NULL指针。
这是我如何检查错误:
首先把这个地方(你并不需要所有这些包括与此库,但我不知道这是一个必须为这个工作) :现在
#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
,对每一位的DirectX调用返回HRESULT(所有Create *来电或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(像素着色器)或其他。