社区
图形处理/算法
帖子详情
●我在DX中怎样用Alpha算法处理.要自己算吗?●
BaoYu
2001-07-26 09:39:11
加精
高手指点~~
...全文
203
22
打赏
收藏
●我在DX中怎样用Alpha算法处理.要自己算吗?●
高手指点~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
灰狼优化器 (GWO):GWO 是一种用于全局优化的新型元启发式
算
法
-matlab开发
GWO
算
法
模仿自然界
中
灰狼的领导层级和狩猎机制。 四种类型的灰狼(例如
alpha
,beta,delta和omega)用于模拟领导层。 此外,还实现了狩猎、搜索猎物、包围猎物和攻击猎物三个主要步骤进行优化。 这是论文的源代码:...
alpha
beta
算
法
c语言,对于A*
算
法
、
alpha
-beta
算
法
的思考
A*
算
法
以估值函数为核心。
alpha
-beta 以剪枝为核心。简单的说就是把比已知的一步棋更臭的棋剪掉。现在我希望寻求某个问题接下来几步的最优解,蛮力计
算
是不可行的。A* 的准确性较差。但这本身不是一个博弈情况,...
图像抠图
算
法
学习 - Shared Sampling for Real-Time
Alpha
Matting
陆陆续续的如果累计起来,我估计至少有二十来位左右的朋友加我QQ,向我咨询有关抠图方面的
算
法
,可惜的是,我对这方面之前一直是没有研究过的。除了利用和Photoshop
中
的魔棒一样的技术或者Photoshop
中
的选区菜单
中
...
对于A*
算
法
、
alpha
-beta
算
法
的思考
A*
算
法
以估值函数为核心。
alpha
-beta 以剪枝为核心。简单的说就是把比已知的一步棋更臭的棋剪掉。 现在我希望寻求某个问题接下来几步的最优解,蛮力计
算
是不可行的。A* 的准确性较差。但这本身不是一个博弈...
A*
算
法
中
启发函数的使用
A*
算
法
中
启发函数的使用 启发函数可以用来控制A*
算
法
的行为. 在极端情况下,如果h(n)=0,那么只有g(n)实际上是有用的,这时A*
算
法
也就是迪杰斯特拉
算
法
,它能保证一定可以找到一条最优路径.如果h(n)总是小于(或者...
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章