在使用DirectX 12的过程中,有一些情况下会出现编译Shader需要很长时间的问题。此时可以尝试使用预编译的Shader来解决此问题。具体实现方式如下所示:
D3DCompileFromFile(shaderFileName, nullptr, nullptr, entryPoint.c_str(), "ps_5_0", D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PARTIAL_PRECISION | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_SKIP_VALIDATION | D3DCOMPILE_ALL_RESOURCES_BOUND | D3DCOMPILE_OPTIMIZATION_LEVEL2 | D3DCOMPILE_FLAGS2_FORCE_ROOT_SIGNATURE_LATEST, 0, &byteCode, &errorBlob);
其中,D3DCOMPILE_PARTIAL_PRECISION和D3DCOMPILE_PREFER_FLOW_CONTROL选项可以根据实际情况来决定是否添加。D3DCOMPILE_FLAGS2_FORCE_ROOT_SIGNATURE_LATEST选项是指强制使用最新的根签名版本。
if (byteCode)
{
HRESULT result = D3DWriteBlobToFile(byteCode, (shaderFileName + ".cso").c_str(), true);
if (FAILED(result))
{
// Write error message to the log
}
byteCode->Release();
}
HRESULT result = D3DReadFileToBlob((shaderFileName + ".cso").c_str(), &byteCode);
if (FAILED(result))
{
// Print error message to the log