●我在DX中怎样用Alpha算法处理.要自己算吗?●

BaoYu 2001-07-26 09:39:11
加精
高手指点~~
...全文
203 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Star_Desert 2002-01-06
  • 打赏
  • 举报
回复
browse
Fan_Lwc 2001-10-09
  • 打赏
  • 举报
回复
啊屁兄(APIer),在这里胡弄人:)
BaoYu 2001-08-01
  • 打赏
  • 举报
回复
我没时间研究啦.
我正在做ERP系统分析.
只好暂时放下这个东西.
好可惜.
加分~~
BaoYu 2001-08-01
  • 打赏
  • 举报
回复
TO APIer(APIer)
哦,非常感谢您的代码.
(我学习~~)
hitwd2000 2001-07-29
  • 打赏
  • 举报
回复
看不太懂
jerry2 2001-07-29
  • 打赏
  • 举报
回复
MMX汇编呀.呵呵
APIer 2001-07-29
  • 打赏
  • 举报
回复
BaoYu(永远的朋友) :这个是我以前写的游戏引擎的alpha混合的代码,不过是基于内存bitmap的,稍微修改一下就可以在surface上使用,不过这个surface最好是system内存的,要不再显存中可就非常慢了,有了surface你可以
surface->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);那么
ddsd.lpsurface就是图形的数据指针,你替换调下面的目的指针就可以了
最后需要surface->unlock(&ddsd);
注意操作的时候注意4字节对齐和图形格式:)

我的email : APIer@china.com
如果需要,我可以给你我的引擎代码
bool JBitmap::AlphaToBitmap16(JBitmap& bmp,int X,int Y,short nDepth,JRect& rc,bool bMask)
{
//if(bmp.m_nBitCount!=16||m_nBitCount!=16)
// return false;
VALIDATE(bmp.m_nBitCount==16&&m_nBitCount==16,0,false);
nDepth%=33;
if(X<0)
X=0;
if(Y<0)
Y=0;
if(X>bmp.GetWidth())
X=bmp.GetWidth();
if(Y>bmp.GetHeight())
Y=bmp.GetHeight();
WORD * wdDest, * wdRes;
int nDestW=bmp.m_nPitch>>1;
int nResW=m_nPitch>>1;
wdDest=(WORD *)bmp.m_lpData;
wdDest+=(bmp.m_nHeight-1)*(nDestW);
wdDest-=Y*nDestW-X;
wdRes=(WORD *)m_lpData;
wdRes+=(m_nHeight-1)*nResW;
wdRes-=(rc.top)*(nResW)-rc.left;
int nH=rc.bottom-rc.top;
int nW=rc.right-rc.left;
JRect rc1(X,Y,nW,nH);
JRect rcTemp(0,0,m_nWidth,m_nHeight);
JudgeRect(rc1,rcTemp,rc1);
JRect rc2(0,0,bmp.m_nWidth,bmp.m_nHeight);
JRect rcUse;
JudgeRect(rc1,rc2,rcUse);
short nUseH=rcUse.Height-1;
short nUseW=rcUse.Width;
if(nUseH<=0||nUseW<=0)
return false;
//long tt=m_nColorKey;
//WORD wdD,wdR;
//WORD wdDR,wdDG,wdDB,wdRR,wdRG,wdRB;
int nUnUsed1=m_nPitch+nUseW*2;
int nUnUsed2=bmp.m_nPitch+nUseW*2;
__int64 __Mask64=0x0001000100010001 * (short)m_nColorKey;
__int64 __Mask=0x001f001f001f001f;
short nMMXCount=nUseW/4;
short nNotMMX=nUseW%4;
__int64 __Depth=0x0001000100010001 * nDepth;
if(bMask)
{
__asm
{
//pusha;
movq mm6,__Depth;
mov eax,dword ptr wdDest;
mov ebx,dword ptr wdRes;
mov cx,nUseH;
Add_Next_Row:
cmp cx,0;
je All_End;
xor dx,dx;
Next_MMX_Point:
cmp dx,nMMXCount;
je Not_MMX_Point;
movq mm0,[eax];
movq mm1,[ebx];
movq mm7,mm1;
pcmpeqw mm7,__Mask64;
psubusw mm1,mm7;
pand mm7,mm0;
por mm1,mm7;

movq mm2,mm0;//g
psrlw mm2,5;
pand mm2,__Mask;
movq mm3,mm1;
psrlw mm3,5;
pand mm3,__Mask;

movq mm4,mm0;//r //wdDR=(((wdDR-wdRR)*nDepth+(wdRR<<5))>>5);
psrlw mm4,10;
pand mm4,__Mask;
movq mm5,mm1;
psrlw mm5,10;
pand mm5,__Mask;

//psllw mm0,1;//b
pand mm0,__Mask;
//psllw mm1,1;
pand mm1,__Mask;

psubsw mm0,mm1;
pmullw mm0,mm6;
psllw mm1,5;
paddsw mm0,mm1;
psrlw mm0,5;
//psrlw mm0,5;
//paddusw mm0,mm1;

psubsw mm2,mm3;
pmullw mm2,mm6;
psllw mm3,5;
paddsw mm2,mm3;
psrlw mm2,5;
//psrlw mm2,5;
//paddusw mm2,mm3;

psubsw mm4,mm5;
pmullw mm4,mm6;
psllw mm5,5;
paddsw mm4,mm5;
psrlw mm4,5;
//psrlw mm4,5;
//paddusw mm4,mm5;

//psllw mm0,10;
psllw mm2,5;
psllw mm4,10;

por mm0,mm2;
por mm0,mm4;

movq [eax],mm0;

add eax,8;
add ebx,8;
inc dx;
jmp Next_MMX_Point;
Not_MMX_Point:
xor dx,dx;
Not_MMX_Next:
cmp dx,nNotMMX;
je Row_End;
sub eax,2;
sub ebx,2;
inc dx;
jmp Not_MMX_Next;
Row_End:
sub eax,nUnUsed2;
sub ebx,nUnUsed1;
dec cx;
jmp Add_Next_Row;
//loop Add_Next_Row;
All_End:
//popa;
emms;
}
}
else
{
__asm
{
//pusha;
movq mm6,__Depth;
mov eax,dword ptr wdDest;
mov ebx,dword ptr wdRes;
mov cx,nUseH;
Add_Next_Row1:
cmp cx,0;
je All_End1;
xor dx,dx;
Next_MMX_Point1:
cmp dx,nMMXCount;
je Not_MMX_Point1;
movq mm0,[eax];
movq mm1,[ebx];
//movq mm7,mm1;
//pcmpeqw mm7,__Mask64;
//psubusw mm1,mm7;
//pand mm7,mm0;
//por mm1,mm7;

movq mm2,mm0;//g
psrlw mm2,5;
pand mm2,__Mask;
movq mm3,mm1;
psrlw mm3,5;
pand mm3,__Mask;

movq mm4,mm0;//r //wdDR=(((wdDR-wdRR)*nDepth+(wdRR<<5))>>5);
psrlw mm4,10;
pand mm4,__Mask;
movq mm5,mm1;
psrlw mm5,10;
pand mm5,__Mask;

//psllw mm0,1;//b
pand mm0,__Mask;
//psllw mm1,1;
pand mm1,__Mask;

psubsw mm0,mm1;
pmullw mm0,mm6;
psllw mm1,5;
paddsw mm0,mm1;
psrlw mm0,5;
//psrlw mm0,5;
//paddusw mm0,mm1;

psubsw mm2,mm3;
pmullw mm2,mm6;
psllw mm3,5;
paddsw mm2,mm3;
psrlw mm2,5;
//psrlw mm2,5;
//paddusw mm2,mm3;

psubsw mm4,mm5;
pmullw mm4,mm6;
psllw mm5,5;
paddsw mm4,mm5;
psrlw mm4,5;
//psrlw mm4,5;
//paddusw mm4,mm5;

//psllw mm0,10;
psllw mm2,5;
psllw mm4,10;

por mm0,mm2;
por mm0,mm4;

movq [eax],mm0;

add eax,8;
add ebx,8;
inc dx;
jmp Next_MMX_Point1;
Not_MMX_Point1:
xor dx,dx;
Not_MMX_Next1:
cmp dx,nNotMMX;
je Row_End1;
sub eax,2;
sub ebx,2;
inc dx;
jmp Not_MMX_Next1;
Row_End1:
sub eax,nUnUsed2;
sub ebx,nUnUsed1;
dec cx;
jmp Add_Next_Row1;
//loop Add_Next_Row;
All_End1:
//popa;
emms;
}
}
return true;
}
BaoYu 2001-07-29
  • 打赏
  • 举报
回复
如果各位谁有DDraw或D3D实现Alpha算法的代码
能不能让小弟一饱眼福~~
多谢各位高手~~
APIer 2001-07-29
  • 打赏
  • 举报
回复
MMX其实很好懂的,只要对汇编了解一点就可以了。
至于d3d的alpha那个是自动支持的,你只要设置好纹理的alpha位然后
lpD3DObject->m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
lpD3DObject->m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
lpD3DObject->m_pd3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, TRUE);
然后
ddrval=lpD3DObject->m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0 , 2 );
来渲染就是了上面的东西是我刚刚学习d3d封装的简单东西,说法也不见的对:)
BaoYu 2001-07-28
  • 打赏
  • 举报
回复
如果各位谁有DDraw或D3D实现Alpha算法的代码
能不能让小弟一饱眼福~~
多谢各位高手~~
dcom3 2001-07-27
  • 打赏
  • 举报
回复
UP
dave75 2001-07-27
  • 打赏
  • 举报
回复
gz
BaoYu 2001-07-27
  • 打赏
  • 举报
回复
我已经给贴子加分啦。
BaoYu 2001-07-27
  • 打赏
  • 举报
回复
如果各位谁有DDraw或D3D实现Alpha算法的代码
能不能让小弟一饱眼福~~
多谢各位高手~~
BaoYu 2001-07-27
  • 打赏
  • 举报
回复
哦。
谢谢楼上的。
我会加分的。
我还想再听听各位高手的见解~~
jixian 2001-07-27
  • 打赏
  • 举报
回复
hao
BaoYu 2001-07-27
  • 打赏
  • 举报
回复
如果各位谁有DDraw或D3D实现Alpha算法的代码
能不能让小弟一饱眼福~~
多谢各位高手~~
APIer 2001-07-26
  • 打赏
  • 举报
回复
如果是DirectDraw程序,那么很惨,因为alpha不是被自动支持,自己锁定表面算(不用MMX指令会很慢的),如果是d3d程序,那么恭喜,设定渲染模式就可以支持,SetRenderState
和SetTextureStageState函数就可以设置纹理的渲染模式为alpha但是纹理格式你可要自己处理alpha格式为a4r4g4b4或者a1r5g5b5格式等等,不过d3d可是一个非常麻烦的东西,我最近正在努力学习:)
lanzhengpeng2 2001-07-26
  • 打赏
  • 举报
回复
d3d中确实有Alpha贴图的现成的代码。但是,如果你还不会d3d,那只好自己写alpha的代码。
BaoYu 2001-07-26
  • 打赏
  • 举报
回复
楼上的,
能不能再详细一些.
因为我对DX不是很熟悉
多谢指教~~
加载更多回复(2)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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