一个快速的8级ALPHA混合算法

原创 2007年09月12日 10:25:00

虽然主题是C++和图形,但好象没有写过一篇关于图形的,现在发一个,添补空白。下面是一个同事写的实现8ALPHA混合的算法,虽然只有8级,但比我用定点数写的实现任意级的要快许多倍。从这个示例可以看出算法的威力,也可以看出数学是多么重要。

 

/// 获取RGB分量的掩码

#define RGB565_R_MASK    0xF800

#define RGB565_G_MASK   0x07E0

#define RGB565_B_MASK    0x001F

 

#define RGB565_R_LBIT      0x0800

#define RGB565_G_LBIT     0x0020

#define RGB565_B_LBIT      0x0001

 

#define RGB565_R_MBIT     0x8000

#define RGB565_G_MBIT    0x0400

#define RGB565_B_MBIT     0x0010

/// 混合了RGB?位

#define RGB565_MSBIT       (RGB565_R_MBIT | RGB565_G_MBIT | RGB565_B_MBIT)

#define RGB565_LSBIT (RGB565_R_LBIT | RGB565_G_LBIT | RGB565_B_LBIT)

 

#define RGB565_R_M2BIT   (RGB565_R_MBIT | (RGB565_R_MBIT >> 1))

#define RGB565_G_M2BIT   (RGB565_G_MBIT | (RGB565_G_MBIT >> 1))

#define RGB565_B_M2BIT   (RGB565_B_MBIT | (RGB565_B_MBIT >> 1))

 

#define RGB565_R_M3BIT   (RGB565_R_MBIT | (RGB565_R_MBIT >> 1) | (RGB565_R_MBIT >> 2))

#define RGB565_G_M3BIT   (RGB565_G_MBIT | (RGB565_G_MBIT >> 1) | (RGB565_G_MBIT >> 2))

#define RGB565_B_M3BIT   (RGB565_B_MBIT | (RGB565_B_MBIT >> 1) | (RGB565_B_MBIT >> 2))

 

 

void vBlendImage(unsigned int vAddr, 图像结构指针 lpImage, unsigned int xSrc, unsigned int ySrc, unsigned int width, unsigned int height, unsigned int coef)

{

       unsigned int i,j,dwidth,dheight,deltawidth;

       unsigned int* dp = (unsigned int *)vAddr, *dp1, *sp = lpImage->databuf;

 

       if(xSrc >= (DTMAXX + 1) || ySrc >= (DTMAXY + 1)){

              return;

       }

 

       dwidth = lpImage->width;

       dheight = lpImage->height;

 

       deltawidth = dwidth - width;

 

/*    if(xSrc + width > (DTMAXX + 1)){

              width = (DTMAXX + 1) - xSrc;

       }

      

       if(ySrc + height > (DTMAXY + 1)){

              height = (DTMAXY + 1) - ySrc;

       }*/

      

       dp += (ySrc * (DTMAXX + 1) + xSrc);

 

       for(i=0; i<height; i++){

              dp1 = dp;

              for(j=0; j<width; j++){

                     unsigned int scolor, dcolor;

                     unsigned int mcolor;

                     unsigned int skcolor, dkcolor;

                     unsigned int xcolor;

                    

                     scolor = *sp++;

                     xcolor = dcolor = *dp1;

 

                     skcolor = scolor & RGB565_LSBIT;

                     scolor = scolor & ~RGB565_LSBIT;

 

                     dkcolor = dcolor & RGB565_LSBIT;

                     dcolor = dcolor & ~RGB565_LSBIT;

 

                     if(coef & BIT0){

                            mcolor = xcolor & skcolor;

                            xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

                            xcolor = (xcolor >> 1) + mcolor;

                     }

 

                     if(coef & BIT1){

                            mcolor = xcolor & skcolor;

                            xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

                            xcolor = (xcolor >> 1) + mcolor;

                     }else{

                            if(xcolor != dcolor){

                                   mcolor = xcolor & dkcolor;

                                   xcolor = (xcolor & ~RGB565_LSBIT) + dcolor;

                                   xcolor = (xcolor >> 1) + mcolor;

                            }

                     }

 

                     if(coef & BIT2){

                            mcolor = xcolor & skcolor;

                            xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

                            xcolor = (xcolor >> 1) + mcolor;

                     }else{

                            if(xcolor != dcolor){

                                   mcolor = xcolor & dkcolor;

                                   xcolor = (xcolor & ~RGB565_LSBIT) + dcolor;

                                   xcolor = (xcolor >> 1) + mcolor;

                            }

                     }

 

                     *dp1++ = xcolor;

              }

              sp += deltawidth;

              dp += (DTMAXX + 1);

       }

}

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

【寒江雪】Alpha通道混合技术

Alpha通道与混合技术  Alpha通道是计算机中存储一张图片的透明和半透明信息的通道。它是一个8位的灰度通道,用256级灰度来记录图像中的透明度信息,定义透明,不透明和半透明区域,其中黑色表示全透...
  • lkysyzxz
  • lkysyzxz
  • 2016年12月24日 03:51
  • 719

Direct-X学习笔记--Alpha颜色混合

Alpha混合技术是灰常有用的东东。待我好好学习一下。 一.简介 首先看一下Alpha通道,Alpha通道是计算机中存储图片透明度信息的通道,它是一个8位灰度的通道,用256级灰度记录图像中的透明信息...
  • puppet_master
  • puppet_master
  • 2015年08月08日 17:53
  • 1373

alpha混合技术

alpha混合技术对熟悉游戏的人来说不会陌生,这种技术在如今的游戏特效里已经被用烂了。3D 的游戏就不说了,2D的游戏里,这种技术也是满眼皆是。   alpha混合听上去很神秘,实际非常简单,其...
  • michaelcao1980
  • michaelcao1980
  • 2013年06月27日 14:52
  • 1004

Shader第十三讲 Alpha混合

http://blog.sina.com.cn/s/blog_471132920101d8z5.html Alpha Blending,中文译作Alpha混合 Blending就是控制透明...
  • OnafioO
  • OnafioO
  • 2016年08月24日 15:47
  • 1283

【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术

在这篇文章里面,我们一起非常详细地探讨了Direct3D中Alpha混合相关的内容。首先是认识了Alpha通道与混合技术,然后结识了融合因子,了解了融合运算方式和融合因子的取法,以及Alpha的三处来...
  • zhmxy555
  • zhmxy555
  • 2013年11月11日 00:08
  • 29241

OpenGL: Alpha融合和图片透明度-AlphaBlend

Alpha融合,不论是在3D还是2D中都常见,最常见的应用就是:设置图片的透明度,不透明度,可以实现抠图。 其实现思想如下:有个混合因子,主要是颜色混合:浮点表示:0.0f 整数表示: 0x00 分开...
  • Augusdi
  • Augusdi
  • 2014年02月26日 17:09
  • 4721

alpha blending算法--详细解读

*转载时请注明出处和作者联系方式:[http://blog.csdn.net/mimepp]一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用3X8=24位表示。 在...
  • qq_15079039
  • qq_15079039
  • 2016年03月29日 20:20
  • 2055

alpha混合算法资料整理

转载:http://www.xuebuyuan.com/2073463.html 1、 背景理论 1.1 对于alpha混合的理解 所谓 Alpha-Blending...
  • aa93226aa
  • aa93226aa
  • 2017年01月18日 12:53
  • 778

OpenGL核心技术之混合技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年02月08日 22:37
  • 2361

RGBA alpha 透明度混合算法

Alpha 透明度混合算法,网上收集整理,分成以下三种: 一、 R1,G1,B1,Alpha1 为前景颜色值,R2,G2,B2,Alpha2 为背景颜色值,则         前景色  R...
  • lrb2010
  • lrb2010
  • 2013年02月23日 19:38
  • 324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个快速的8级ALPHA混合算法
举报原因:
原因补充:

(最多只允许输入30个字)