D3DX11CompileFromFile返回S_OK但CreateVertexShader抛出错误

时间:2013-06-24 07:02:30

标签: c++ windows directx shader directx-11

所以我有以下代码:

    extern ID3D11Device* dev;
    extern ID3D11DeviceContext* devcon;        

    //shaders
    ID3D10Blob *VS, *PS, *error;
    HRESULT r;
    error = 0;

    r = D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", D3DCOMPILE_DEBUG, 0, 0, &VS, &error, 0);
    if(FAILED(r))
    {
        LPCWSTR errmsg = (LPCWSTR)error->GetBufferPointer();
        MessageBox(hWnd, errmsg, L"error", MB_OK);
        return;
    }

    error = 0;
    r = D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", D3DCOMPILE_DEBUG, 0, 0, &PS, &error, 0);
    if(FAILED(r))
    {
        LPCWSTR errmsg = (LPCWSTR)error->GetBufferPointer();
        MessageBox(hWnd, errmsg, L"error", MB_OK);
        return;
    }

    // encapsulate both shaders into shader objects
    r = dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &vertexShader);
    r = dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pixelShader);

    devcon->VSSetShader(this->vertexShader, 0, 0);
    devcon->PSSetShader(this->pixelShader, 0, 0);

为顶点和像素着色器运行代码D3DX11CompileFromFile会返回S_OK,但是当代码命中CreateVertexShader()时,它会引发访问冲突,并且在我的生命中我可以'弄清楚原因。我可能做了一些相当愚蠢的事情,我似乎无法弄明白。

2 个答案:

答案 0 :(得分:1)

此类错误的最常见原因是devVS为空/未初始化。如果访问冲突发生在0x00000xxx,那么它是一个空指针。如果它是0xCCCCCxxx,那么它是一个未初始化的指针(假设您在Visual Studio下运行)。此外,最好将接口指针(例如代码中的VS和PS)清零,然后再将它们释放(并且指针即将超出范围),因为这可以防止双重指针上的空闲,并防止指针在指针未正确分配或以某种方式被覆盖时不会将断点设置为停止。

答案 1 :(得分:0)

嗯,我不是DirectX中的专家,但如果我是正确的,c ++编译器会在运行时将.hlsl变为.cso。因此,您应该将D3“XDES11CompileFromFile”参数从L“shaders.hlsl”更改为L“shaders.cso”,并对该函数的另一个调用执行相同的操作。

这应该允许程序正确读取.hlsl文件。