在Direct3D11中使用effect

来源:互联网 发布:学市场营销的软件 编辑:程序博客网 时间:2024/05/01 00:32
DX SDK August 2009已经包含了DXSDK的RTM,但似乎新的effect系统还不成熟,反正被降级到D3DX11了,而且源文件被放到utilities里让用户自己编译lib。
 
具体使用方法如下:
找到utilities文件夹里的effect11,build出d3dx11effects.lib
将d3dx11effect.h和d3dx11effects.lib复制到你想放的位置上(自己的程序可以找到就行)
使用时,需要包含d3dx11effect.h和d3dx11effects.lib,还需要加上d3dcompiler.lib
fx文件需要先编译才能创建effect(目前没有D3D10中诸如D3DX10CreateEffectFromFile的功能)
使用D3DXCompileFromFile编译,然后用D3DX11CreateEffectFromMemory创建effect.例如如下代码:

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( D3DX11CreateEffectFromMemory(pCode->GetBufferPointer(),pCode->GetBufferSize(), NULL, pDevice,&g_pEffect ) );

还有一个很重要的问题需要注意:

如果显卡是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了。

原创粉丝点击