在Direct3D11中使用effect

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中诸如D3DX10CreateEffectFromFi le的功能)
使用D3DXCompileFromFile编译,然后用D3DX11CreateEffectFromMe mory创建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了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值