游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3828|回复: 6

HGE没有减法混合,如何自己扩展?

[复制链接]

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
发表于 2009-8-10 20:16:00 | 显示全部楼层 |阅读模式
HGE没有减法混合,如何自己扩展?
HGE内核原代码中的_setblendmode方法,其中没有发现blend_alphaadd标志,不过有blend_coloradd标志等。HGE给DX纹理设置了d3dtop_add标志以实现blend_coloradd效果,DX有d3dtop_subtract标志但HGE却没提供blend_colorsubtract标志以实现纹理减法。换句话说,我只要加入给DX纹理设置d3dtop_subtract标志就可以实现纹理减法。当然我想实现的并不是blend_colorsubtract而是减法的blend_alpha。但奇怪的是在HGE内核原代码中搜索不到blend_alphaadd是在哪里处理的,我想知道,如何扩展透明减法功能。

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
 楼主| 发表于 2009-8-10 20:34:00 | 显示全部楼层

Re:HGE没有减法混合,如何自己扩展?

晕,怎么发了两遍

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
 楼主| 发表于 2009-8-10 20:41:00 | 显示全部楼层

Re:HGE没有减法混合,如何自己扩展?

最不理解的是blend_alphaadd和blend_colormul还有blend_nozwrite标志宏的值怎么都是0?但是位或后却会对设置有影响!?哪载?

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2009-8-11 00:35:00 | 显示全部楼层

Re:HGE没有减法混合,如何自己扩展?

HGE核心才千行左右,花几天扫一眼吧~

void HGE_Impl::_SetBlendMode(int 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);

        }



    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;

}

看这个,实际上设置渲染模式时根本没测试那几个设置为0的标志。

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
 楼主| 发表于 2009-8-11 01:24:00 | 显示全部楼层

Re:HGE没有减法混合,如何自己扩展?

所以才奇怪啊,为什么明明几个标志值都是0,而且还是位或的,HGE为什么还能知道我有没有设置这个标志?

27

主题

295

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 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

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2009-8-11 22:24:00 | 显示全部楼层

Re:HGE没有减法混合,如何自己扩展?

因为标志宏是非此即彼的关系啊。没设BLEND_COLORADD就意味着设置了BLEND_COLORMUL。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 18:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表