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混合中的乘法运算,我们也有办法进一步优化,可以采用移位乘法的技术来
实现快速的乘法运算,但性能提升不大,有兴趣的朋友可以自己查阅相关资料,这里不再详述
相关推荐
源码的配套博文是 《 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术》 ,文章地址http://blog.csdn.net/poem_qianmo/article/details/15026917, 点击Release文件夹下的...
Direct3d 实现alpha混合技术 适合初学者
基于FPGA的Alpha半透明图像叠加算法硬件实现.pdf
《Direct3D 实时渲染技术》一书第九章 ALPHA混合代码示例
laplacianBlend:MATLAB脚本,使用拉普拉斯金字塔金字塔混合技术将两个图像混合在一起,并给出了将两个图像分开的alpha蒙版
融合STM32 Chrom-ART技术 更加出色的性能和更低的CPU占用率 高刷新率提升动画流畅度增强用户体验 Alpha混合 抗锯齿字体和间距控制 文字旋转 多国语言 特效功能 触摸手势 2D/3D旋转和缩放
《Direct3D技术内幕》所涉及的主题包括:DirectX 7基础,通过Direct3D和 T&L流水线的转换和照明,渲染对象图元,使用DirectInput与用户交互交控制力 反馈设备,纹理处理、雾化、alpha混合以及其他3D基本概念,高级...
高级轻型动力总成和混合动力分析 (ALPHA) 工具由 EPA 创建,用于评估轻型 (LD) 车辆的温室气体 (GHG) 排放。 ALPHA 是一种基于物理学的、前瞻性的、整车计算机模拟,能够分析结合不同动力总成技术的各种车辆类型。 ...
演示顶点混合技术。 10、UseSkinMeshClass 演示蒙皮骨骼动画网格模型的渲染、蒙皮骨骼动画网格模型类的封装和使用。 11、MultiAnimMesh 演示多骨骼动画网格模型的渲染、骨骼动画之间的切换。 12、MeshFromOBJ 演示保...
Alpha Blending技术是一个混合各种颜色值并产生透明效果的过程。具体的实现原理也很简单:在GDI+中,任何一种颜色由四种成分组成――Alpha,Red,Green和Blue。其中的Alpha成分则代表了一种颜色的透明程度,它的值在...
V2.5 版中的新增功能: Hybrid Shader,可自动兼容内置和通用渲染管线 包括: ...- 透明度(Alpha 混合和 Alpha 测试) 着色器生成器中的扩展功能: - 纹理阈值(手绘着色) - 子平面散射 - 颜色遮
- 透明度(Alpha 混合和 Alpha 测试) 着色器生成器中的扩展功能: - 纹理阈值(手绘着色) - 子平面散射 - 颜色遮罩 - 草图覆盖 - 溶解 - 透明度 - 风格化水 - 风动画 - 遮挡剪影 - 纹理混合 - 三平面贴图 ...以及...
8.2.2 利用alpha混合实现半透明效果 8.2.3 alpha混合系数 8.3 alpha测试 8.3.1 alpha测试原理 8.3.2 使用alpha测试 8.4 小结 第9章 雾化 9.1 雾化效果实现原理 9.2 雾化混合因子计算方法 9.3 顶点雾化与像素雾化 ...
图像处理是指使用计算机算法和技术对图像进行分析、增强、修改或生成的过程。其中,背景抠图(Background ...可以使用图像融合算法(如拉普拉斯金字塔融合、Alpha混合等)将前景与背景进行平滑地混合,以实现自然的效
全书共分5部分,包括16章的内容...第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。
本书是游戏编程畅销书作者André...第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。
本书是游戏编程畅销书作者André...第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。