【问题标题】:First tackling Shaders. Having initial confusion with a DirectX Tutorial首先处理着色器。最初对 DirectX 教程感到困惑
【发布时间】:2011-07-23 16:46:12
【问题描述】:

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

页面底部代码中的代码相同,并且可以编译,但在调试时出现访问冲突。谁能告诉我我需要做什么才能使其正常运行?

谢谢。

【问题讨论】:

    标签: directx shader hlsl directx-11


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多