[D3D9] 图元半透明&alpha混合 所需要的参数设置 (含自定义alpha、纹理自带alpha)
2017-04-26 11:26
766 查看
VS2013 Demo 下载
图元半透明显示,需要用到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通道值
图元半透明显示,需要用到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通道值
相关文章推荐
- ogre 渲染时候需要顶点支持颜色混合和alpha渲染状态需要作如下设置
- 我对【纹理颜色混合】与【ALPHA混合】的理解
- 使用Office2003自带虚拟打印机的一些参数设置。
- OpenGL ES 纹理参数设置方法 glTexParameter
- android中给Dialog设置的动画如何自定义修改参数
- recvfrom sendto的解释 多线程编程需要注意的地方 全局变量的设置 自定义消息 大杂烩inet_
- 我对【纹理颜色混合】与【ALPHA混合】的理解
- 自定义cell需要动态设置内部控件的frame时没有效果
- 添加自定义参数及设置方式
- 使用ImageView时使用src参数设置显示内容时需要设置scaleType参数
- win7系统开机声音个性化设置(系统自带或自定义)
- 自定义打印内容参数设置
- 20. 纹理混合透明度设置
- ylbtech-cnblogs(博客园)-数据库设计-2,Admin(用户后台)-用户自定义参数设置
- D3D 纹理阶段混合状态设置
- 如何在wince BSP中设置activesync 通讯所需要的参数
- 【C#】进行HTTP请求需要设置的参数
- 添加自定义参数及设置方式
- CCMotionStreak(ccnode子类 可实现拖尾效果 需要设置--- 消隐动画时长,拖尾条带相邻顶点间的最小距离,拖尾条带的宽度,顶点颜色,纹理)
- android中给Dialog设置的动画如何自定义修改参数