继了个续,上代码先。。。。。
void HGE_Impl::_render_batch(bool bEndScene)
{
if(VertArray)
{
pVB->Unlock();
if(nPrim)
{
switch(CurPrimType)
{
case HGEPRIM_QUADS:
pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, nPrim<<2, 0, nPrim<<1);
break;
case HGEPRIM_TRIPLES:
pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, nPrim);
break;
case HGEPRIM_LINES:
pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, nPrim);
break;
}
nPrim=0;
}
if(bEndScene) VertArray = 0;
else pVB->Lock( 0, 0, (BYTE**)&VertArray, 0 );
}
}
记得前面经常使用的这个函数吗,_render_batch批量渲染,函数控制两个东西,一个是参数那个,控制渲染是否结束
另一个就是画我们的基本图元了,按照当前类型掉dx的基本图元绘制函数。
void HGE_Impl::_SetBlendMode(int blend)
{ //这个判断在于看blend和现在的blend的透明度混合一样否
if((blend & BLEND_ALPHABLEND) != (CurBlendMode & BLEND_ALPHABLEND))
{ //设定不同的混合方式
if(blend & BLEND_ALPHABLEND) pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
else pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
}
//是否开z缓冲
if((blend & BLEND_ZWRITE) != (CurBlendMode & BLEND_ZWRITE))
{
if(blend & BLEND_ZWRITE) pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
else pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
}
if((blend & BLEND_COLORADD) != (CurBlendMode & BLEND_COLORADD))
{ //设定纹理阶段状态
if(blend & BLEND_COLORADD) pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
else pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
CurBlendMode = blend;
}
设置混合模型
使用位运算的意义在于用一个变量blend就可以表示多个状态
最后一个的SetTextureStageState说一下,第一个参数是纹理层数(取值0-7),第二个是纹理颜色的混合方法(混合有很多不同的公式就用这个设)
第三个是具体设定的值,DX的寻址做的很强大,就是比较记忆麻烦。
设定完之后赋值给当前模型。
void HGE_Impl::_SetProjectionMatrix(int width, int height)
{
D3DXMATRIX tmp;
D3DXMatrixScaling(&matProj, 1.0f, -1.0f, 1.0f);
D3DXMatrixTranslation(&tmp, -0.5f, height+0.5f, 0.0f);
D3DXMatrixMultiply(&matProj, &matProj, &tmp);
D3DXMatrixOrthoOffCenterLH(&tmp, 0, (float)width, 0, (float)height, 0.0f, 1.0f);
D3DXMatrixMultiply(&matProj, &matProj, &tmp);
}
这个看名字就比较熟悉,设置投影矩阵,也就是视口范围。
和前面裁剪那边的设置方式差不多。
bool HGE_Impl::_GfxInit()
{
static const char *szFormats[]={"UNKNOWN", "R5G6B5", "X1R5G5B5", "A1R5G5B5", "X8R8G8B8", "A8R8G8