我正在用C#写了一个封装DX9的类,对于alpha效果不知道有什么好的方法??主要是效率问题

IT写轮眼 2003-09-13 10:40:32
我现在已经用C#写了一个封装DX9的的工具类。其中包括DirectDraw图形,keyboard,mouse,audio,video。
目前我在处理alpha透明效果上遇到点难题,希望得到帮助。过2天我就把原码公开,
放到网上。希望大家可以一起研究一下。

在这个贴子里,我不想去讨论用C#写游戏的利弊,我只是想写一个这样的东西,和大家交流一下coding的心得。
...全文
58 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT写轮眼 2003-09-14
  • 打赏
  • 举报
回复
唉,可惜C#中不能内嵌汇编,看来我只有用C++写成DLL供C#调用了。不过为了效率也只有这样了。
wzt226 2003-09-14
  • 打赏
  • 举报
回复
up
这个我不会吧,接分的.
gpml 2003-09-14
  • 打赏
  • 举报
回复
这是我以前写的带MMX的Alpha:
Graphics::AlphaBlending(LPDIRECTDRAWSURFACE7* GDS_Src,//源页面
int x_src,int y_src,//x,y
LPDIRECTDRAWSURFACE7* GDS_Des,//目标页面
int x_des,int y_des,//x,y
int width,int height,//混合大小
WORD alpha,//alpha级数(0-32,16位模式)
DWORD ColorKey)

{
WORD *bit_src;
WORD *bit_des;
WORD pit_src;
WORD pit_des;
WORD r,g,b;
DWORD New_ColorKey;
DWORD Distance_Src,Distance_Des;
int lone=width%4;
int new_width=width-lone;

WORD alpha_c=32-alpha;
WORD alphag=alpha*2;
WORD alphag_c=alpha_c*2;

b=WORD(ColorKey>>16>>3);
g=WORD((ColorKey&0xff00)>>8>>2<<5);
r=WORD((ColorKey&0xff)>>3<<11);
New_ColorKey=((r+g+b)<<16)|(r+g+b);

Graphics::LockSurface (GDS_Src,&bit_src,&pit_src);
Graphics::LockSurface (GDS_Des,&bit_des,&pit_des);
bit_src=&bit_src[x_src+y_src*pit_src];
bit_des=&bit_des[x_des+y_des*pit_des];

Distance_Src=(pit_src-width)*2;
Distance_Des=(pit_des-width)*2;

__int64 mask=0xffffffffffffffff;

__int64 mask5=0x0020002000200020;
__int64 Alpha=0x0001000100010001*alpha;

_asm
{
push eax;
push ebx;
push ecx;
push edx;

mov eax,dword ptr bit_src;
mov ebx,dword ptr bit_des;
mov ecx,0;
mov edx,0;

movd mm0,New_ColorKey;
punpckldq mm0,mm0;

next_point:
movq mm1,[eax];
movq mm2,[ebx];
movq mm5,[eax];

pcmpeqw mm5,mm0;
paddusw mm1,mm5;
pxor mm5,mask;
paddusw mm2,mm5;
pand mm1,mm2;
movq mm5,mm1;

//*******************************R
movq mm1,mm5;
movq mm2,[ebx];

movq mm7,Alpha;
movq mm6,mask5;
psubusw mm6,mm7;

psrlw mm1,11;
psrlw mm2,11;
pmullw mm1,mm7;
pmullw mm2,mm6;
paddw mm1,mm2;
psrlw mm1,5;

psllw mm1,11;

//*******************************G
psllw mm6,1;
psllw mm7,1;

movq mm2,mm5;
movq mm3,[ebx];

psllw mm2,5;
psrlw mm2,10;
psllw mm3,5;
psrlw mm3,10;
pmullw mm2,mm7;
pmullw mm3,mm6;
psrlw mm2,6;
psrlw mm3,6;
paddw mm2,mm3;
psllw mm2,5;

//*******************************B
psrlw mm6,1;
psrlw mm7,1;

movq mm3,mm5;
movq mm4,[ebx];

psllw mm3,11;
psrlw mm3,11;
psllw mm4,11;
psrlw mm4,11;
pmullw mm3,mm7;
pmullw mm4,mm6;
psrlw mm3,5;
psrlw mm4,5;
paddw mm3,mm4;

////////////////////////////////////
por mm1,mm2;
por mm1,mm3;

movq [ebx],mm1;

add eax,8;
add ebx,8;

add ecx,4;

cmp ecx,new_width;
jae next_row;

jmp next_point;
next_row:
/* mov ecx,lone;
not_mmx:
cmp ecx,0;
jae next;
push ecx;
add eax,2;
add ebx,2;
mov ecx,[eax];



next:*/
inc edx;
cmp edx,height;
jae all_end;

mov ecx,0;

add eax,Distance_Src;
add ebx,Distance_Des;

jmp next_point;
all_end:
pop eax;
pop ebx;
pop ecx;
pop edx;

emms;
}

Graphics::UnLockSurface (GDS_Src);
Graphics::UnLockSurface (GDS_Des);
}
jianglinchun 2003-09-13
  • 打赏
  • 举报
回复
呵,好啊,可惜偶的主要方面不在这里,今天刚写了自己的投票显示界面,也在为透明的问题烦恼哦,帮楼主upup。

欢迎楼主去看看,给点提高图像精度的意见:
http://diyinside.cnred.net/voteview.aspx
IT写轮眼 2003-09-13
  • 打赏
  • 举报
回复
我对D3D不是很熟,而且我的本本的3d性能不行,嘻嘻。
gpml 2003-09-13
  • 打赏
  • 举报
回复


可以用MMX来提速,不过没有硬件加速来得快哈,为什么不用D3D呢?

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧