D3DX11CompileFromFile(L"effect11.fx",NULL, NULL, NULL, "fx_5_0",D3D10_SHADER_SKIP_VALIDATION|D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY,NULL, NULL, &pCode, &pError, NULL);
V_RETURN( D3DX11CreateEffectFromMe
还有一个很重要的问题需要注意:
如果显卡是D3D10级别,在创建Device的时候通常会选择例如D3D_FEATURE_LEVEL_10_0,这时候会导致编译shader失败从而无法绘制场景。这个问题存在于effect11project的EffectNonRuntime.cpp里,原代码如下(第1270行左右): (XNAForum的牛人发现的)
if (pShader->pReflectionData->RasterizedStream== D3D11_SO_NO_RASTERIZED_STREAM )pShader->IsValid =FALSE;
elseif( FAILED((m_pDevice->*(pShader->pVT->pCreateShader))((UINT *)pShader->pReflectionData->pBytecode,pShader->pReflectionData->BytecodeLength,m_pClassLinkage,&pShader->pD3DObject) ) )
{
pShader->IsValid =FALSE;
}
但如果Device不是11_0,则m_pClassLinkage必须为NULL,所以这里无法通过。
我们可以更改原代码如下:
if(pShader->pReflectionData->RasterizedStream== D3D11_SO_NO_RASTERIZED_STREAM )
pShader->IsValid = FALSE;
elseif( FAILED((m_pDevice->*(pShader->pVT->pCreateShader))((UINT *)pShader->pReflectionData->pBytecode,pShader->pReflectionData->BytecodeLength,m_pClassLinkage,&pShader->pD3DObject) ) )
{
if( FAILED((m_pDevice->*(pShader->pVT->pCreateShader))((UINT *)pShader->pReflectionData->pBytecode,pShader->pReflectionData->BytecodeLength,0, &pShader->pD3DObject) ))
pShader->IsValid =FALSE;
}
很简单,多加一层判断即可。
然后build出新的d3dx11effects.lib应该就可以正常使用effect了。