[D3D9] 图元半透明&alpha混合 所需要的参数设置 (含自定义alpha、纹理自带alpha)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/felicityWSH/article/details/70791851

图元半透明显示,需要用到alpha混合。根据红龙书所述,alpha值的来源有两种:
1、纹理自带的alpha通道值(比如png) 
2、自定义alpha

假设已创建了D3D9设备对象: IDirect3DDevice9* pDevice9;
如果要使用alpha混合,需要对pDevice9对象进行以下设置:

如果要显示纹理 需要设置纹理过滤
pDevice9->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
pDevice9->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
pDevice9->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

设置混合因子
pDevice9->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pDevice9->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

设置alpha通道值的来源(本处设置为使用纹理自带的通道值)
pDevice9->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);  
pDevice9->SetTextureStageState(0, D3DTSS_ALPHAOP,  D3DTOP_SELECTARG1);
D3DTA_TEXTURE 表示使用纹理自带的alpha
D3DTA_DIFFUSE 使用自定义的alpha

启用alpha混合状态
pDevice9->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
根据红龙书所述,只有在渲染某些需要半透明效果的图元时,才应该临时启用这个状态,并且在该图元渲染结束时应随即禁用该状态。
因为启用这个状态后,D3D在渲染时会进行相关的像素计算,影响渲染速度,所以建议在不需要的时就禁用。

如果是显示纹理,需要禁用光照
pDevice9->SetRenderState(D3DRS_LIGHTING, FALSE);

如果使用纹理自带的alpha值,则后续的代码与显示普通纹理的逻辑一样。
如果使用自定义的alpha值,则需要借助D3DMATERIAL9对象(具体请参考附带的demo、及D3D的灯光):
D3DMATERIAL9 TeapotMtrl;
// init TeapotMtrl
TeapotMtrl.Diffuse.a = 0.5f; // 设置alpha值
pDevice9->SetMaterial(&TeapotMtrl);

备注》
如果会使用HLSL,也可以在像素着色器中修改alpha通道,实现纹理(包括不带alpha通道的纹理)的透明效果


红龙书D3D9-第七章 对应的工程》
MtrlAlpha:使用自定义的alpha通道值
texAlpha:使用图片自带的alpha通道值

猜你喜欢

转载自blog.csdn.net/felicityWSH/article/details/70791851
今日推荐