从内存创建效果时出错(c ++,directx 11)

时间:2016-01-01 15:10:40

标签: c++ directx

我正在尝试从我编译的着色器创建一个效果变量,所以我可以引用变量并设置它们的值,但是出了点问题。我从Frank Luna的 3D Game Programming简介中提取了一个片段,并在必要时进行了调整

HRESULT hr;
DWORD shaderFlags = 0;
ID3D10Blob * compiledShader = 0;
ID3D10Blob * compilationMessages = 0;
hr = D3DX11CompileFromFile(L"cubemap.fx", 0, 0, 0, "fx_4_0", shaderFlags, 0, 0, &compiledShader, &compilationMessages, 0);
if (FAILED(hr))
{
    MessageBox(nullptr,
        L"Failed to compile cubemap shader D3DX11", L"Error", MB_OK);
    return hr;
}
ID3DX11Effect * shader;
hr = D3DX11CreateEffectFromMemory(
    compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), 0, device, &shader);
if (FAILED(hr))
{
    MessageBox(nullptr,
        L"Could not create effect from memory", L"Error", MB_OK);
    return hr;
}

它会抛出错误

Could not create effect from memory

HR = E_FAIL

Attempted to create a device with the debug layer enabled and the layer is not installed.

我尝试稍微调试并重建效果库但仍然没有。有人可以发现问题或告诉我如何找到原因吗?

编辑:我认为问题在于调试层。我尝试使用(D3D10和D3D11)启用调试层

#if defined(_DEBUG) || defined (DEBUG)
    shaderFlags |= D3D10_CREATE_DEVICE_DEBUG;
    shaderFlags |= D3D10_SHADER_DEBUG;
    shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif

我的设备标志也启用调试模式

    UINT createDeviceFlags = 0;

#if defined (_DEBUG) || defined(DEBUG)
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

我正在使用Windows 8.1,Visual Studio默认使用Windows 8.1 SDK,但我也引用了旧的2010年6月SDK,这就是问题所在。我上面尝试使用的方法来自旧的SDK。

我相信所有需要的dll都是为调试层安装的。 enter image description here

我也有旧sdk的dll(我用来引用旧方法的那个)enter image description here

解决

我下载了最新版本的Effects11,并使用兼容的fx版本(fx_5_0)编译了着色器

1 个答案:

答案 0 :(得分:0)

拉出最新版本的Effects 11似乎解决了这个问题。