0

所以我有以下代码:

    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()它时会引发访问冲突,对于我来说,我无法弄清楚为什么。我可能做了一些相当愚蠢的事情,我似乎无法弄清楚。

4

2 回答 2

1

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

于 2013-08-13T17:26:33.627 回答
0

好吧,我不是 DirectX 的专家,但如果我是正确的,C++ 编译器会在运行时将 .hlsl 转换为 .cso。因此,您应该将 D3DX11CompileFromFile 参数从 L"shaders.hlsl" 更改为 L"shaders.cso",并对函数的其他调用执行相同操作。

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

于 2013-07-17T06:11:31.977 回答