该站点非常糟糕,因为它根本没有任何错误检查。必须检查每个返回 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(像素着色器)之类的东西。