`
hereson3
  • 浏览: 162905 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

alpha混合技术

阅读更多

alpha混合技术

alpha混合技术对熟悉游戏的人来说不会陌生,这种技术在如今的游戏特效里已经被用烂了。3D

的游戏就不说了,2D的游戏里,这种技术也是满眼皆是。
  alpha混合听上去很神秘,实际非常简单,其作用就是要实现一种半透明效果。假设一种不

透明东西的颜色是A,另一种透明的东西的颜色是B,那么透过B去看A,看上去的颜色C就是B和A

的混合颜色,可以用这个式子来近似,设B物体的透明度为alpha(取值为0-1,0为完全透明,1

为完全不透明)

R(C)=alpha*R(B)+(1-alpha)*R(A)
G(C)=alpha*G(B)+(1-alpha)*G(A)
B(C)=alpha*B(B)+(1-alpha)*B(A)

  R(x)、G(x)、B(x)分别指颜色x的RGB分量。看起来这个东西这么简单,可是用它实现的效

果绝对不简单,应用alpha混合技术,可以实现出最眩目的火光、烟雾、阴影、动态光源等等一

切你可以想象的出来的半透明效果。

  火光、烟雾的效果是事先做好一个火或雾的图和一个alpha通道图(用过Photoshop的人都该

知道什么是alpha通道),画上去的时候每点每点计算,得到的就是火光掩映的效果。雾化效果

在3D里还需要模糊一下,在这里就免了,本来alpha混合就有不小的计算量了,算法再不优化再

加上模糊或其它的一些什么原因,那么你就是在看幻灯片了。(关于优化,网上见仁见智,我再

找时候再讲)。

  动态光源,听起来高深的一塌。那我先讲一下阴影,这个就简单了,以往的游戏也有阴影(

象《仙剑》),不过我们把它升一下级,从不透明变成半透明而已。就是把一个影子图放在地表

上面作alpha混合(而且可以简化,因为影子的alpha值可以是一定的,这样就可以大幅提高计算

速度)就OK了。

  该讲动态光源了。我们把没有光源的地方想象成一张黑幕蒙在屏幕上,没光也就什么都看

不到。那么我们就加上一个光源,相当于在黑幕上挖了一个洞,这个洞的大小就是被照亮的范

围,现在我们可以看到下面的东西了。但现在这个效果说是光源,倒不如说是个窗户,要显得

象光源,就要让光源的中心最亮,逐渐向四周暗下去,最后到什么都看不见,这才象个光源。

具体实现就是alpha混合啦,蒙版的颜色是黑,中心alpha值为0,完全透明,到光源的尽头

alpha值为1,完全不透明,成果就是这个样子,象这么回事吧!光源做好了,动态的光源就是

实时生成一个动态的alpha蒙版,然后盖上去就行了。

  不难吧!游戏里(其实也不只游戏,好多算法也是这样)的一些技术听起来很玄,说通了也

就是那么回事,只不过不是一下子就能想到就是了。


    现在再谈谈Alpha混合。Alpha混合指的是给定两个点P1、P2,其RGB颜色分量分别为

(r1,g1,b1)和(r2,g2,b2),假定P1位于P2的后面,P2的透明度为a(0%<a<100%),要求我没透过

点P2看到P1的颜色值是多少。假定该值为P3(r3,g3,b3),其计算公式如下:
    r3=(1-a)*r2+a*r1;
    g3=(1-a)*g2+a*g1;
    b3=(1-a)*b2+a*b1;
    这就是通常所说的Alpha混合。

 

    优化一下得到:
    r3=r2+a*(r1-r2);
    g3=g2+a*(g1-g2);
    b3=b2+a*(b1-b2);
    少做了一次乘法运算。但由于a为浮点数,运算起来仍然很慢,所以一般不采用上面的公式

,而采用整数级的Alpha混合,如下:
    r2=r2+n*(r1-r2)/256;
    g2=g2+n*(g1-g2)/256;
    b2=b2+n*(b1-b2)/256;
    以上为256级Alpha混合公式,由于VGA/SVGA调色板寄存器为6bits,所以做256色的Alpha混

合意义不大。

 

    而采用一下的64级Alpha混合公式:
    r2=r2+n*(r1-r2)/64;
    g2=g2+n*(g1-g2)/64;
    b2=b2+n*(b1-b2)/64;

 

    进一步优化为L:
    r2=r2+(n*(r1-r2)>>6);
    g2=g2+(n*(g1-g2)>>6);
    b2=b2+(n*(b1-b2)>>6);

 

    仅做了一次乘法运算,这样程序应该能跑得飞快了。

 

    下面给出混合一个点的Alpha算法:
    int Alpha(int p1,int p2,int n)
    {
        int c1[3];
        int c2[3];
        int c3[3];

 

        GETRGB(p1,c1,c1+1,c1+2);
        GETRGB(p2,c2,c2+1,c2+2);

 

        c3[0]=c2[0]+(n*(c1[0]-c2[0])>>6);
        c3[1]=c2[1]+(n*(c1[1]-c2[1])>>6);
        c3[2]=c2[2]+(n*(c1[2]-c2[2])>>6);

 

        return ARGB(c3[0],c3[1],c3[2]);
    }

 

    对半透明混合,可有如下更快的公式:
    r2=r2+((r1-r2)>>1);
    g2=g2+((g1-g2)>>1);
    b2=b2+((b1-b2)>>1);
    这个公式没有乘法和除法,半透明在游戏中运用也很广。

 

    以下是半透明的Alpha混合:
    int Alpha(int p1,int p2,int n)
    {
        int c1[3];
        int c2[3];
        int c3[3];

 

        GETRGB(p1,c1,c1+1,c1+2);
        GETRGB(p2,c2,c2+1,c2+2);

 

        c3[0]=c2[0]+((c1[0]-c2[0])>>1);
        c3[1]=c2[1]+((c1[1]-c2[1])>>1);
        c3[2]=c2[2]+((c1[2]-c2[2])>>1);

 

        return ARGB(c3[0],c3[1],c3[2]);
    }

 

    对于n级Alpha混合中的乘法运算,我们也有办法进一步优化,可以采用移位乘法的技术来

实现快速的乘法运算,但性能提升不大,有兴趣的朋友可以自己查阅相关资料,这里不再详述

分享到:
评论

相关推荐

    D3D9 alpha混合 demo (自定义alpha和纹理自带alpha)

    《D3D9 Alpha混合技术详解——基于VS2013的实现》 Direct3D 9(简称D3D9)是微软提供的一种强大的图形编程接口,用于处理复杂的3D图形渲染。在游戏开发、视觉特效等领域,Alpha混合技术是一项不可或缺的功能,它...

    duff-porter_alpha混合_Thomas!_

    Alpha混合技术在实际应用中通常分为预乘Alpha和非预乘Alpha两种情况。预乘Alpha是将颜色值与Alpha值相乘,提前考虑了透明度对颜色的影响。非预乘Alpha则保留原始颜色信息,混合时再根据Alpha值调整。 在3D渲染中,...

    VS2008下的win32Alpha混合的例子

    在本文中,我们将深入探讨如何在Visual Studio 2008 (VS2008)环境下使用DirectX 2009(DX2009)实现Win32应用程序中的Alpha混合技术,以创建一个飞机模型的混合效果。Alpha混合是一种图形处理技术,用于将两个或多个...

    alpha混合算法代码(c语言)

    在计算机图形学中,Alpha混合(Alpha Blending)是一种用于实现图像或像素的半透明效果的技术。这种技术广泛应用于2D和3D图形渲染、游戏开发、图像编辑软件等领域。在C语言中实现Alpha混合算法,可以让我们更好地...

    AlphaBlend_alpha混合_Alpha_Direct3D_

    在计算机图形学领域,Alpha混合(Alpha Blending)是一种重要的技术,用于实现图像或像素的透明和半透明效果。在DirectX编程中,它被广泛应用于游戏开发、图像处理和其他实时渲染应用。本文将深入探讨Alpha混合的...

    【C++】3D游戏Alpha混合程序源码by浅墨

    源码的配套博文是 《 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术》 ,文章地址http://blog.csdn.net/poem_qianmo/article/details/15026917, 点击Release文件夹下的...

    Direct alpha

    在提供的压缩包文件“Direct alpha”中,可能包含了示例代码、教程文档或者演示程序,这些都是学习和实践Direct3D Alpha混合技术的好资源。通过深入研究这些材料,初学者能够更全面地理解如何在实际项目中应用这一...

    《Direct3D 实时渲染技术》一书代码示例--ahpha混合

    通过学习这一章节,读者将能够深入理解Direct3D中的Alpha混合技术,并能将其应用到自己的实时渲染项目中,创建出具有复杂透明效果的三维场景。压缩包中的"Alpha_blend"文件很可能是书中示例代码,包含了实现这些概念...

    OpenGL混合例子

    在这个"OpenGL混合例子"中,我们将深入探讨OpenGL中的Alpha混合技术,这是一种在渲染时实现半透明效果的关键方法。 首先,让我们理解Alpha通道的概念。在色彩模型中,如RGBA(Red, Green, Blue, Alpha),Alpha值...

    dx9 alpha混合纹理

    在3D图形编程中,Alpha混合纹理是一项关键的技术,它使得物体的表面可以具有半透明或者透明的效果,增加了场景的深度和真实感。本文将深入探讨DX9中的Alpha混合纹理,以及如何通过原代码实现这一功能。 首先,我们...

    dx9_alpha_blending_material.zip_Alpha_alpha混合_direct Alpha_direc

    在DirectX 9中,Alpha混合(Alpha Blending)是一种重要的图形渲染技术,它允许我们创建半透明或透明效果,使图像元素能够彼此混合,从而产生丰富的视觉效果。这个压缩包"dx9_alpha_blending_material.zip"显然是为...

    3D地表多纹理按Alpha通道混合

    在3D图形编程中,地表的纹理混合是一种常见的技术,用于模拟真实世界中的复杂地形。"3D地表多纹理按Alpha通道混合"是指利用Alpha通道信息将多个不同的纹理结合在一起,以创建出具有丰富细节和真实感的3D地表。这种...

    学习目标掌握深度缓冲Alpha混合和Alpha测试掌握多边形.pdf

    Alpha混合和Alpha测试都是Direct3D中重要的技术,广泛应用于游戏和图形开发中。 多边形填充模式和渲染模式是Direct3D中的两个重要概念。多边形填充模式是指渲染多边形时使用的填充模式,如点填充、线框填充等。渲染...

    嵌入式图形处理器Alpha混合单元设计与实现.pdf

    Alpha混合是图形处理中的一个关键步骤,它涉及到图像层之间的透明度控制,使得多层图像能够平滑地融合在一起,创造出深度感和复杂的视觉效果。本文主要介绍了一种针对嵌入式GPU的Alpha混合单元的设计与实现方法。 ...

    易语言RGB颜色Alpha混合源码.zip

    而Alpha混合则是RGB颜色模型的一个扩展,引入了透明度的概念,使得图像可以有不同程度的不透明度,即所谓的“半透明”效果。 易语言,作为一款中国本土开发的、面向初学者的编程语言,提供了对RGB和Alpha混合的支持...

    易语言RGB颜色Alpha混合源码

    在易语言中实现RGB颜色的Alpha混合,主要是通过对两个颜色的R、G、B分量进行线性插值运算,并结合Alpha值来计算出混合后颜色的分量。这种技术在计算机图形学中被称为Alpha blending。其基本公式可以表示为: ```...

    e语言-易语言RGB颜色Alpha混合

    本知识点主要聚焦于易语言中的RGB颜色与Alpha混合,这是一种在图形处理和界面设计中常见的技术,用于创建半透明效果。 首先,我们要了解RGB颜色模型。RGB(Red, Green, Blue)是一种加色模型,通过红、绿、蓝三种...

    位图透明绘制, alpha混合 完整示例代码

    `表示源图像将按照阿尔法通道覆盖目标图像,这是一种最常见的混合模式。`bf.BlendFlags = 0;`保持默认设置,`bf.AlphaFormat = 0;`表示阿尔法值存储在源颜色的最后一个字节中。`bf.SourceConstantAlpha`是一个0到255...

    DX Alpha 颜色 混合 颜色透明显示

    在3D图形和游戏开发中,Alpha混合是一个关键的技术,它允许对象在屏幕上显示时具有半透明或透明的效果。 DX中实现颜色混合通常涉及到两个关键步骤:颜色计算和Alpha测试。颜色计算是通过将源颜色(Source Color)和...

Global site tag (gtag.js) - Google Analytics