首先攻击着色器。最初与DirectX教程混淆

时间:2011-07-23 03:59:46

标签: directx shader hlsl directx-11

我正在使用DirectX教程,对Visual C ++ 2010上的C ++知之甚少。我知道到目前为止我已经足够了解/了解所有内容,但现在我正在尝试包含一个HLSL着色器。我有我需要的内容,但我不知道HLSL需要什么样的文件。是否需要制作文件格式?我已经尝试将着色器代码放入.cpp文件,但是当我使用CreateVertexShader函数时,我得到了一个访问冲突。我把它放在一个头文件中,但它读取了像C ++这样的HLSL代码,并且出现了语法错误。教程在这里:http://www.directxtutorial.com/Tutorial11/B-A/BA5.aspx

页面底部代码中的代码是相同的,它会编译,但在调试时会出现访问冲突。有谁能告诉我我需要做些什么来让它正常运行?

感谢。

1 个答案:

答案 0 :(得分:1)

该网站非常糟糕,因为它根本没有任何错误检查。每个返回HRESULT 必须的directX调用都会被检查错误。如果它返回S_OK一切正常。查看文档,确保选中 EVERY directX返回值。

您的着色器可能有错误并且无法编译,因此您可能会将NULL指针传递给CreateVertexShader。

以下是我检查错误的方法:

首先把它放在某处(你不需要所有这些包含和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(所有Create *调用或compile_shader_from_file调用)的每个directX调用,执行以下操作:

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(像素着色器)等等。