龙儿今天来谈一下这个Direct的融合吧。
要说简单其实很简单,只要调用SetRenderState把blend打开就行,要说难的话可能有点难以理解它到底怎么混合。
龙儿就借用一下龙书里的一个公式
outpixel = srcpixel x srcfactor + dstpixel x dstfactor;
其中的x运算为颜色值里面各个分量相乘。例如:srcpixel = (As, Rs, Gs, Bs); srcfactor = (Af, Rf, Gf, Bf);
那他们的x运算结果为(As * Af, Rs * Rf, Gs * Gf, Bs * Bf);
而这里的srcpixel为你要画的像素。已经画好的像素为dstpixel.
srcfactor与dstfactor的话可以通过SetRenderState来设定。具体参数见帮助文档。
好吧,龙儿也不废话了,上代码吧。
m_device->Clear(0, 0, D3DCLEAR_STENCIL | D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_RGBA(0, 255, 255, 255), 1, 0);
龙儿先把destpixel设为(0, 255, 255, 255);
struct Vertex
{
float x, y, z;
// float u1, v1;
DWORD color;
Vertex(float _x, float _y, float _z, DWORD _color)//, float _u1, float _v1)
{
x = _x; y = _y; z = _z;
// u1 = _u1; v1 = _v1; u2 = _u2, v2 = _v2;
color = _color;
}
static const DWORD FVF = D3DFVF_XYZ |D3DFVF_DIFFUSE;
};
这是顶点结构。
HRESULT hr;
hr = m_device->CreateVertexBuffer(6 * sizeof(Vertex), 0, Vertex::FVF,
D3DPOOL_DEFAULT, &m_vb, NULL);
if (FAILED(hr))
{
return FALSE;
}
Vertex* v;
m_vb->Lock(0, 0, (void**)&v, 0);
v[0] = Vertex(-0.5f, 0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 0.0f, 0.0f);
v[1] = Vertex(0.5f, 0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 1.0f, 0.0f);
v[2] = Vertex(-0.5f, -0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 0.0f, 1.0f);
v[3] = Vertex(-0.5f, -0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 0.0f, 1.0f);
v[4] = Vertex(0.5f, 0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 1.0f, 0.0f);
v[5] = Vertex(0.5f, -0.5f, 1.0f, D3DCOLOR_RGBA(255, 255, 255, 154));//, 1.0f, 1.0f);
m_vb->Unlock();
龙儿把srcpixel设为白色,alpha值为0.6。
m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
这里的话龙儿把srcfactor设为srcpixel的alpha值。dstfactor设为1 - srcfactor.
按照这个来算的话
outpixel = (255, 255, 255, 154) x (0.6, 0.6, 0.6, 0.6) + (0, 255, 255, 255) x (0.4, 0.4, 0.4, 0.4)
但alpha值的话并不能凭肉眼看出,所以最终得出的RGB值为(153, 255, 255).
口说无凭,上图为证:
这是背景颜色(0, 255, 255)
这是blend之后的颜色(154, 255, 255).
可能有人要说跟我上面算出的结果不一样,其实是因为小数点产生的一点误差。毕竟154/255并不是整除。如果你们不用小数而用分数表示的话结果就一样了。
好吧,龙儿今天就说这么点。下次再继续吧。。。