青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  顯然DirectDraw是Windows下寫2D圖形程序的最好選擇,雖然Direct3D也可以寫,但是沒DirectDraw簡單方便,特別對于初學者,一來就接觸那么多函數和參數總不是件愉快的事,所以我的文章主要結合我做的工作,談談DirectDraw編程中一些比較關鍵的技術,大多是我自己想出來的。我想先聲明,我的文章可以任意轉載,源代碼可以任意使用和修改。

  由于我是業余時間寫的文章,所以只能每次發表一篇,希望我的工作可以為大家的游戲增光添彩,同時我的文章主要面向有基本C++,DirectDraw,匯編和MMX編程經驗的朋友,如果你對這些了解不夠,請先學習一下再閱讀。也歡迎大家和我交流,我的QQ是35830152,EMAIL:EUHO@SINA.COM。

  作為第一篇,我想先談談Alpha混合的問題。這里32位色的圖形模式我們不考慮,因為技巧并不多,占用顯存和內存大,實際應用的也不多。我們把焦點放在16位色的模式上。我們把源點C2和Alpha通道點C1用Alpha混合,混合后得到點C,如果Alpha取0~1,公式如下:

C = C2*Alpha + C1*(1-Alpha)

如果Alpha取0~32,公式如下:

C = (C2*Alpha + C1*(1-Alpha))>>5

每個點由R,G,B 3個分量組成,所以上面的運算要分別對每個分量進行計算,如果整體計算,由于進位的關系我們會得到錯誤的結果。我們只考慮用得較多的565格式,即16位的顏色值為RRRRRGGGGGGBBBBB,555格式原理是一樣的。顯然我們每次處理一個點似乎只能按照“拆分-分別運算-拆分”來寫代碼,但是這樣是低效的,想想1024*768模式下運算一幀要進行多少次運算,一定快不到哪里去。

  Intel有段很長的代碼,我沒仔細看,也沒試驗,總覺得不太可靠(呵呵)。還看了GameRes上的一些相關文章,還是有值得參考的地方,就是覺得看了還是有些茫然。

  下面說我的算法,首先說明這個快速算法是針對每個Alpha值建立一個函數進行運算,如果在一個函數里實現任意Alpha的運算,一次只能運算2個點,而且匯編代碼是26行,而且有2次乘法,也用到了部分MMX加速。經過針對每一級Alpha的優化處理,每次處理4個點,代碼只要8行左右,移位代替了乘法運算,完全發揮了MMX的威力。我只做了17級變換,0級和17級不用做,1到15原理一樣,只有少少的不同,現在我舉例半透明的算法,其他大家可以自己實現,有問題也可以和我交流。

  Alpha運算中每個點3個色素,每個色素都要按上面那個公式運算,也就是每個色素要做2次乘法和一次加發,盡管可以變換一下不做浮點運算,但性能又能提高多少?我先講一下我算法的一個基本原理,即“任意分組移位”,意思就是把一個數中分為N組,每組位數并不要求相同,我們用一次移位和一次與運算就能做到好像是每個分組移位而互不影響的效果。比半透明下Alpha=0.5,換成移位就是>>1,我們先把C右移一位,然后AND 一個2進制的數0111101111101111(0x7BEF),就完成了3個色素同時*0.5的運算,簡單吧。

  代碼相信大家很容易就看懂了,大家把匯編部分和自己的程序結合就可以了,只要提供一些參數,比如頁面數據指針和長度高度等資料.下次我會發布帶Colorkey和Clip功能的代碼,同樣是MMX處理的,而且不用if(這會大大降低流水線的效率).以后還會介紹動態光源,灰度圖,動畫控制等高級主題,歡迎大家指導,由于水平和打字原因,可能文章中會有錯誤,請諒解.

下面是任意Alpha的混合運算

BOOL
CAresMaterial::DrawAlpha( LONG X, LONG Y, LPRECT pRect, BYTE Alpha )
{
    unsigned __int16 *pSrc, *pDest;
   
unsigned __int32 A, PA;
   
unsigned __int16 Width, Height;
   
unsigned __int32 D1, D2;
   
RECT Rect;

   
A = Alpha & 0x1F;
   
PA = 0x1F - A;
   
Width = (unsigned __int16)(pRect->right - pRect->left + 1);
   
Height = (unsigned __int16)(pRect->bottom - pRect->top + 1);
   
D1 = (m_Desc.dwPitch - Width + 1)<<1 ;
   
D2 = (m_Desc.pAres->GetScreenPitch() - Width + 1)<<1 ;
   
SetRect( &Rect, X, Y, X+Width-1, Y+Height-1 );
   
m_Desc.pAres->BackToDILayer( &Rect );
   
pSrc = m_Desc.pData + pRect->top*m_Desc.dwPitch + pRect->left;
   
pDest = m_Desc.pAres->GetDILayerData() + Y*m_Desc.pAres->GetScreenPitch() + X;


   
__asm
   
{
   
   
mov esi,pSrc
   
   
mov edi,pDest
   
   
movd mm2,A
   
   
movd mm3,PA

   
   
mov cx,Height
   
   
shl ecx,16
   
   
mov cx,Width

   
LOOPA:
   
   
ror ecx,16
   
   
dec cx
   
   
jz DONE
   
   
ror ecx,16

   
LOOPB:
   
   
dec cx
   
   
jz NEXTLINE
   
   
//Process one point
   
   
mov ax,[esi]
   
   
mov dx,ax
   
   
shl eax,16
   
   
mov ax,dx
   
   
and eax,0x7E0F81F
   
   
movd edx,mm2
   
   
mul edx
   
   
movd mm0,eax

   
   
mov ax,[edi]
   
   
mov dx,ax
   
   
shl eax,16
   
   
mov ax,dx
   
   
and eax,0x7E0F81F
   
   
movd edx,mm3
   
   
mul edx
   
   
movd mm1,eax

   
   
paddd mm0,mm1
   
   
psrlq mm0,5
   
   
movd eax,mm0
   
   
and eax,0x7E0F81F
   
   
mov edx,eax
   
   
shr edx,16
   
   
or eax,edx
   
   
mov [edi],ax

   
   
inc esi
   
   
inc edi
   
   
inc esi
   
   
inc edi
   
   
jmp LOOPB

   
NEXTLINE:
   
   
add esi,D1
   
   
add edi,D2
   
   
mov cx,Width
   
   
jmp LOOPA

   
DONE:
   
   
emms
   
}

   
m_Desc.pAres->DILayerToBack( &Rect );

   
return TRUE;
}



下面是半透明Alpha的混合運算

void
CAresMaterial::DrawAlpha1( LONG X, LONG Y, LPRECT pRect )
{

    unsigned __int16 *pSrc, *pDest;
    unsigned __int16 Width, Height, DW, DLeft;
    unsigned __int32 D1, D2;
    static unsigned __int64 MASKER = 0x7BEF7BEF7BEF7BEF;
    RECT Rect;

    Width = (unsigned __int16)(pRect->right - pRect->left);
    Height = (unsigned __int16)(pRect->bottom - pRect->top + 1 );
    pSrc = m_Desc.pData + pRect->top*m_Desc.dwPitch + pRect->left;
    pDest = m_Desc.pAres->GetBackData() + Y*m_Desc.pAres->GetScreenPitch() + X;

    DLeft = (Width % 4) + 1;
    DW = (Width>>2) + 1;

    D1 = (m_Desc.dwPitch - Width)<<1 ;
    D2 = (m_Desc.pAres->GetScreenPitch() - Width)<<1 ;
    SetRect( &Rect, X, Y, X+Width, Y+Height-1 );

    __asm
    {
        mov esi,pSrc
        mov edi,pDest
        mov bx,DLeft

        mov cx,Height
        shl ecx,16
        mov cx,DW

    LOOPA:
        ror ecx,16
        dec cx
        jz DONE
        ror ecx,16

    LOOPB:
        dec cx
        jz ENDLINE
        //Process four points once
        movq mm0,[esi]
        movq mm1,[edi]
        psrlq mm0,1
        psrlq mm1,1
        pand mm0,MASKER
        pand mm1,MASKER
        paddw mm0,mm1
        movq [edi],mm0

        add esi,8
        add edi,8
        jmp LOOPB

    ENDLINE:
        dec bx
        jz NEXTLINE
        mov ax,[esi]
        mov dx,[edi]
        shr ax,1
        shr dx,1
        and ax,0x7BEF
        and dx,0x7BEF
        add ax,dx
        mov [edi],ax
        inc esi
        inc esi
        inc edi
        inc edi
        jmp ENDLINE

    NEXTLINE:
        add esi,D1
        add edi,D2
        mov cx,DW
        mov bx,DLeft
        jmp LOOPA

    DONE:
        emms
    }
}

posts - 15, comments - 0, trackbacks - 0, articles - 0

Copyright © 莫失莫忘

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩国产999| 久久久之久亚州精品露出| 欧美日韩一级视频| 欧美国产三区| 欧美日韩1080p| 欧美日韩在线观看一区二区三区| 欧美大片在线看免费观看| 欧美成人综合网站| 欧美日韩国产在线看| 国产精品二区二区三区| 国产精品成人午夜| 国产专区欧美精品| 影音先锋日韩资源| 亚洲精品裸体| 亚洲欧美久久久久一区二区三区| 性做久久久久久免费观看欧美 | 噜噜噜久久亚洲精品国产品小说| 久久综合九色综合欧美就去吻| 美女诱惑黄网站一区| 欧美国产精品日韩| 国产美女一区| 亚洲高清二区| 亚洲一区免费| 麻豆久久婷婷| 一区二区免费在线视频| 久久成人18免费网站| 欧美国产综合视频| 国产精品免费一区二区三区观看| 在线精品国产欧美| 亚洲欧美日韩国产成人| 欧美大秀在线观看| 亚洲摸下面视频| 欧美成人精品高清在线播放| 国产麻豆综合| 亚洲午夜精品17c| 久久精品人人做人人爽电影蜜月| 欧美日韩精品在线观看| 亚洲高清网站| 欧美怡红院视频一区二区三区| 亚洲第一天堂无码专区| 在线综合欧美| 亚洲第一精品电影| 欧美一区三区二区在线观看| 欧美日韩在线观看视频| 最新国产乱人伦偷精品免费网站| 欧美怡红院视频| 亚洲伊人第一页| 欧美三级免费| 亚洲视频欧美在线| 91久久精品美女高潮| 久久综合一区| 在线观看欧美精品| 久久久久国色av免费看影院| 亚洲综合国产激情另类一区| 欧美午夜精品久久久久久孕妇| 夜夜夜精品看看| 亚洲激情欧美激情| 欧美va亚洲va国产综合| 亚洲国产高清aⅴ视频| 久久裸体艺术| 久久久久国产精品一区二区| 国产性猛交xxxx免费看久久| 欧美在线观看一区二区| 亚洲调教视频在线观看| 国产精品久久久久久久久免费樱桃 | 亚洲精品一区二区三区福利| 久久久99免费视频| 黄色一区二区三区四区| 美女在线一区二区| 久久一区二区三区av| 亚洲成人在线| 亚洲黄色毛片| 国产精品成av人在线视午夜片| 亚洲一区日韩在线| 亚洲永久免费视频| 国产拍揄自揄精品视频麻豆| 欧美制服第一页| 久久精品国产99国产精品| 黄色综合网站| 亚洲国产小视频在线观看| 欧美日本免费| 欧美一区二区大片| 久久久久88色偷偷免费| 亚洲精品一区二区三区樱花| 一本色道久久综合精品竹菊| 国产欧美日韩精品a在线观看| 玖玖综合伊人| 欧美激情综合| 性色一区二区| 久久手机免费观看| 一本一道久久综合狠狠老精东影业 | 久久午夜精品一区二区| 亚洲精品乱码| 亚洲一区二区视频| 在线欧美日韩国产| 亚洲最新色图| 一区免费在线| 一本色道久久综合狠狠躁篇怎么玩 | 欧美高清在线一区二区| 欧美日韩国产精品一区二区亚洲| 午夜亚洲视频| 男人插女人欧美| 亚洲欧美一区二区三区极速播放| 久久精品成人一区二区三区| 中文精品视频| 久久久99爱| 亚洲欧美日韩一区| 免费中文字幕日韩欧美| 欧美主播一区二区三区美女 久久精品人 | 国产欧美大片| 亚洲高清中文字幕| 国产欧美日韩不卡免费| 亚洲理论电影网| 在线成人激情视频| 亚洲一区国产一区| 99精品国产在热久久下载| 久久久久久国产精品mv| 亚洲欧美激情四射在线日 | 欧美在线亚洲| 亚洲欧美国产精品桃花| 欧美成人tv| 美女主播视频一区| 国产综合精品| 欧美一区二区三区在线视频| 亚洲综合色噜噜狠狠| 欧美精品成人在线| 欧美成人免费网| 狠狠色狠狠色综合人人| 亚洲女爱视频在线| 亚洲专区在线| 国产精品成人午夜| 亚洲精品乱码久久久久久久久 | 亚洲欧美久久久| 亚洲婷婷综合色高清在线| 欧美精品一区二区三区蜜臀| 欧美国产日本| 亚洲国产一区二区三区高清| 久久日韩粉嫩一区二区三区| 久久综合色综合88| 黄色成人91| 久久中文欧美| 欧美电影免费观看高清完整版| 狠狠色香婷婷久久亚洲精品| 欧美夜福利tv在线| 久久久久久亚洲精品中文字幕 | 蜜桃精品久久久久久久免费影院| 久久婷婷人人澡人人喊人人爽 | 在线亚洲欧美| 欧美午夜精品一区二区三区| 亚洲视频 欧洲视频| 午夜欧美大尺度福利影院在线看 | 欧美黄色aaaa| 亚洲区一区二区三区| 在线综合欧美| 国产视频欧美视频| 欧美一区在线视频| 蜜臀久久99精品久久久画质超高清| 伊人久久av导航| 欧美激情第五页| 亚洲一区二区三区高清| 久久久久久精| 精品二区视频| 欧美日韩国产麻豆| 亚洲综合成人在线| 欧美成人一区二区三区| 999亚洲国产精| 国产精品v日韩精品v欧美精品网站| 亚洲午夜精品久久久久久浪潮| 久久精品国产清高在天天线| 亚洲国产成人在线播放| 国产精品福利片| 久久这里有精品视频| 一区二区欧美国产| 蜜桃av一区二区三区| 亚洲一区久久久| 亚洲娇小video精品| 欧美三区美女| 久久裸体艺术| 亚洲午夜激情网站| 亚洲第一中文字幕| 久久精品一区二区| 亚洲色图在线视频| 狠狠色丁香婷婷综合| 国产精品成人免费视频| 欧美成人免费大片| 欧美一区二区在线观看| 亚洲精品中文字幕在线| 巨乳诱惑日韩免费av| 午夜日韩视频| 亚洲线精品一区二区三区八戒| 伊人久久成人| 国产亚洲成精品久久| 欧美日韩精品系列| 六月婷婷一区| 久久久久久久一区二区| 午夜精品久久久久久久久久久| 亚洲理伦电影| 亚洲伦理中文字幕| 亚洲国产日韩一级| 免费亚洲电影|