|
发表于 2009-8-11 19:48:00
|
显示全部楼层
Re:HGE没有减法混合,如何自己扩展?
看??
我自己加的
http://www.huosoft.com/bbs/ShowPost.asp?ThreadID=5824
procedure THGEImpl.SetBlendMode(const Blend: Integer);
begin
{
if ((Blend and BLEND_ALPHABLEND) <> (FCurBlendMode and BLEND_ALPHABLEND)) then begin
if ((Blend and BLEND_ALPHABLEND) <> 0) then
FD3DDevice.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA)
else
FD3DDevice.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
end;
if ((Blend and BLEND_ZWRITE) <> (FCurBlendMode and BLEND_ZWRITE)) then begin
if ((Blend and BLEND_ZWRITE) <> 0) then
FD3DDevice.SetRenderState(D3DRS_ZWRITEENABLE,1)
else
FD3DDevice.SetRenderState(D3DRS_ZWRITEENABLE,0);
end;
if ((Blend and BLEND_COLORADD) <> (FCurBlendMode and BLEND_COLORADD)) then begin
if ((Blend and BLEND_COLORADD) <> 0) then
FD3DDevice.SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_ADD)
else
FD3DDevice.SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
end;
}
FD3DDevice.SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
case Blend of
Blend_Default:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
end;
Blend_ColorAdd:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
FD3DDevice.SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_ADD);
end;
Blend_Add:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
end;
Blend_SrcAlphaAdd:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
end;
Blend_SrcColor:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
end;
BLEND_SrcColorAdd:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
end;
Blend_Invert:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
end;
Blend_SrcBright:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);
end;
Blend_Multiply:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);
end;
Blend_InvMultiply:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
end;
Blend_MultiplyAlpha:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);
end;
Blend_InvMultiplyAlpha:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
end;
Blend_DestBright:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTCOLOR);
end;
Blend_InvSrcBright:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVSRCCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
end;
Blend_InvDestBright:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR);
end;
Blend_Bright:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
end;
Blend_BrightAdd:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
end;
Blend_GrayScale:
begin
FD3DDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, Integer(False));
FD3DDevice.SetRenderState(D3DRS_TextureFactor,Integer((ARGB(255,255,155,155))));
FD3DDevice.SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DOTPRODUCT3);
FD3DDevice.SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TFACTOR);
end;
Blend_Light:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
end;
Blend_LightAdd:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
end;
Blend_Add2X:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
end;
Blend_OneColor:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
FD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
FD3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, 25);
FD3DDevice.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
end;
Blend_XOR:
begin
FD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);
FD3DDEvice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
end;
end;
FCurBlendMode := Blend;
end;
http://www.huosoft.com/bbs/ShowPost.asp?ThreadID=5824 |
|