colorkeyxp:同时使用ColorKey以及顶点Alpha效果



(1)如何使用ColorKey?

可以使用张带Alpha通道纹理以及AlphaBlend来实现
也可以使用AlphaTest(先略过不表)

具体做法:
在InitDeviceObjects中加入:
D3DXCreateTextureFromFileEx(m_pd3dDevice,\"a.bmp\",D3DX_DEFAULT,D3DX_DEFAULT,1,0,
D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,D3DX_FILTER_POINT,D3DX_FILTER_POINT,
0xff000000,NULL,NULL,&m_pTexture);
其中你需要使用带alpha通道格式比如A8R8G8B8
色彩键(透明色)我设为了0xff000000纯黑色

这里做个详细介绍说明:
本质上,d3d里没有色彩键所谓色彩键是通过将alpha通道设为0x00来实现
D3DXCreateTextureFromFileEx如果你制定了色彩键(比如0xff000000)
那么会把纹理中所有0xff000000象素alpha通道设置为0x00

些朋友抱怨说:“在这个里使用了色彩键但是没有效果”
其实这个只是设置了alpha通道你需要使用alpha相关绘图效果才会出来

现在我们纹理含有了alpha值(或者说相当于色彩键)
那么我们就需要利用纹理中含有alpha值来进行alpha混合
这样就可以实现色彩键效果

在Render里加入:
//设置alpha混合
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//把alpha参数设为纹理alpha值(下面2行其实也可以去掉,默认就是这样)
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
//渲染图元
m_pd3dDevice->SetFVF(FVF);
m_pd3dDevice->SetStreamSource(0,m_pVB,0,(VERTEX));
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
//还原渲染状态
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);

运行发现确实现了ColoyKey效果!

*****************************************************************

(2)如何使用顶点alpha?

顶点alpha应用很多个例子是在用户界面中利用顶点alpha可以
像QQ那样随意切换透明度(只需要设置下矩形4个顶点alpha值即可)

思路方法是:为顶点dfuse(色彩)设置alpha值
然后使用顶点dfuse里alpha通道来进行alpha混合即可

具体做法:

由于同样是alpha混合操作所以和上面(1)非常类似
因此你可以Ctrl+C、Ctrl+V

首先需要更改顶点定义加上color值或者叫做dfuse
structCOLORVERTEX
{
FLOATx,y,z,rhw;//Thetransformedpositionforthevertex
DWORDcolor;
FLOATtu,tv;[Page]
};
constDWORDFVF=(D3DFVF_XYZRHW|D3DFVF_TEX1|D3DFVF_DIFFUSE);

在InitDeviceObjects加载纹理和(1)去复制粘贴吧^_^

在RestoreDeviceObjects设置各各顶点以及顶点alpha值:
我觉这段代码我可以不用写了
比如我把color最高位也就是alpha通道设为0x88(50%透明)
(根据需要你可能需要实时地改变顶点alpha值这个你自己来写)

现在我们顶点含有了alpha值0x88(50%透明)
那么我们就需要利用顶点中含有alpha值来进行alpha混合
这样就可以实现顶点alpha半透明效果

修改(1)中Render修改1行就可以:
把这行:
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
修改为:
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
这样就可以了也就是更改了个参数而已

运行发现确实现了半透明效果


但是这个顶点alpha效果中没有色彩键这就很讨厌那么如何实现呢?

*****************************************************************

(3)怎样同时使用ColorKey以及顶点Alpha效果?

开门见山先说如何实现:

修改(2)中Render几行代码
为了怕你弄错了我浪费大量篇幅把修改后Render代码全部写出来:

//设置alpha混合
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//设置alpha值(把纹理alpha和顶点alpha进行乘法运算)
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
//渲染图元
m_pd3dDevice->SetFVF(FVF);
m_pd3dDevice->SetStreamSource(0,m_pVB,0,(VERTEX));
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
//还原渲染状态
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);

运行成功地实现了漂亮ColorKey加顶点Alpha效果




介绍说明:

原理是什么呢?
个纹理阶段中d3d可以对2个参数进行某种运算获得个alpha输出(op)值

我们
纹理alpha为0x00--0%(色彩键)时候alphaop为零即完全透明
纹理alpha为0xFF--100%(非色彩键)时候alphaop为顶点alpha

那么很容易想到使用乘法运算
看看头文件D3DTOP_MODULATE做就是乘法运算然后试验通过[Page]


0%*顶点alpha值==0(完全透明)
100%*顶点alpha值==顶点alpha值
(运算时候换算为百分比即0xffalpha值换算为1.0100%)

Tags:  alpha alpha效果 colorkey colorkeyxp

延伸阅读

最新评论

发表评论