我一直在努力创建一个计算着色器,但不能为我的生活找出E_NOTIMPL意味着什么,文档是我见过的最模糊的东西,每个人我已经看到问题有一个单独的解决方案,从操作系统重新安装到清除AppData的临时文件,所以这是我的问题版本。
每当我尝试运行此程序时,它都不会编译着色器文件,HR会返回" E_NOTIMPL"我完全不知道为什么,我已经尝试包括我正在研究的DirectCompute基本样本项目中的所有目录,尽管复制了它的所有项目设置,但它拒绝工作。
这是我运行D3DCompileFromFile的CompileShaderFromFile函数
HRESULT CompileShaderFromFile(const WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut)
{
if (!ppBlobOut)
return E_INVALIDARG;
// find the file
WCHAR str[MAX_PATH];
HRESULT hr = FindDXSDKShaderFileCch(str, MAX_PATH, szFileName);
if (FAILED(hr))
return hr;
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#ifdef _DEBUG
// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DCOMPILE_DEBUG;
// Disable optimizations to further improve shader debugging
dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;
#endif
ID3DBlob* pErrorBlob;;
#if D3D_COMPILER_VERSION >= 46
hr = D3DCompileFromFile(str, nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, szEntryPoint, szShaderModel,
dwShaderFlags, 0, ppBlobOut, &pErrorBlob);
#else
hr = D3DX11CompileFromFile(str, nullptr, nullptr, szEntryPoint, szShaderModel,
dwShaderFlags, 0, nullptr, ppBlobOut, &pErrorBlob, nullptr);
#endif
if (FAILED(hr))
{
if (pErrorBlob)
OutputDebugStringA((char*)pErrorBlob->GetBufferPointer());
SAFE_RELEASE(pErrorBlob);
return hr;
}
SAFE_RELEASE(pErrorBlob);
return S_OK;
}
这是我尝试编译调用CompileFromFile
的计算着色器的地方HRESULT CreateResources()
{
HRESULT hr = S_OK;
ID3DBlob* pBlob = nullptr;
LPCSTR profile = (g_pd3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0) ? "cs_5_0" : "cs_4_0";
// Compile the Ray Rendering Compute Shader
hr = CompileShaderFromFile(L"ExampleCompute.hlsl", "RenderRay", profile, &pBlob);
if (FAILED(hr))
return hr;
最后,这是我的计算着色器的入口点
groupshared uint things;
[numthreads(1, 1, 1)]
void RenderRay(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex)
{
float4 empty = { 0, 0, 0, 0 };
float4 result = trace(empty, raydir, 0);
Data[0] = ToFloat3(result);
}
请询问您是否需要更深入了解我的问题,非常感谢您提前。
更新:我当然记得我在电脑上工作的例子,但现在即使不能使用D3DCompileFromFile,我也没有改变任何东西,非常困惑。
更新2:我重新下载了示例项目,它再次起作用,虽然我无法记住改变它的任何内容......
更新3:我已经让它工作了,事实证明它在编译器中给出了一个关于有一个显然是不允许的递归函数的错误,但这并不能解释什么示例项目出错了,所以我不愿意将其标记为答案......