Alpha值

Alpha混合是为了实现透明效果,透明到什么程度是由alpha值决定的,对于一个32位的ARGB格式的颜色来说,它的组成部分如下:

我们可以看到,最高位的一个byte表示alpha值,它并不代表实际的颜色,它是控制颜色的百分比。范围是0x00 - 0xff,也就是十进制的0-255。它可以控制256个级别的透明程度,0表示完全透明,就是什么也看不见了。255表示完全不透明。随后的三个字节分别表示红绿蓝三原色。那么alpha值是如何工作的呢?如果开启了alpha混合,假设指定了颜色为0x80ff0000,可知alpha值为0x80(十进制128),红色=0xff(十进制255),为满色,绿色和蓝色都为0。于是最终的颜色就是(128 / 255)* 255 = 128,也就是说,透明程度是原来红色的50%。

在D3D中,alpha值的来源有三种:

  • 顶点的diffuse color(漫反射光颜色)或specular color(镜面光颜色)
  • Material(材质)的diffuse color
  • 纹理的alpha channel

使用Material alpha

今天我们看一下如何使用material alpha来实现透明效果,主要的步骤如下:

定义material,并指定diffuse color

在定义Material时,一定要记得使用ZeroMemory将其清空,因为这里用的是局部变量,默认值不确定,如果不清空出现各种奇怪的效果。

HRESULT SetupMaterial(D3DXCOLOR color)
{D3DMATERIAL9 material;ZeroMemory(&material, sizeof(material));material.Ambient = color;material.Diffuse = color;material.Specular = color;material.Emissive = color;g_pd3dDevice->SetMaterial(&material);return D3D_OK;
}

设置material为红色,且alpha值为0x80,这样产生的透明效果是原来颜色的50%。

// Setup material
DWORD color = 0x80ff0000;
SetupMaterial(color);

启用光照

g_pd3dDevice->SetRenderState( D3DRS_LIGHTING , true );

设置material为diffuse material的来源

g_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );

diffuse material的另外两种来源分别是顶点的diffuse color和specular color,对应代码如下

// Set vertex diffuse color as diffuse source
g_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );// Set vertex specular color as diffuse source
g_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR2 );

启用混合

g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

开始混合

在下面的代码中,前面三行是指定两个color的来源及对应的操作,这里我们选择color的来源是diffuse color,操作是直接选择color1,而忽略color2,所以中间一句实际上可以省略。关于颜色的操作,还有很多其他类型,比如相加,相减等等,详情请看D3DTSS_COLOROP这个枚举类型。中间三句是选择两个alpha值的来源及对应他们的操作,也是从diffuse color中选择alpha值,操作也是直接选择第一个alpha值,而忽略第二个。最后三行开始真正的混合操作,第一行是指定源像素的alpha因子,这里是D3DBLEND_SRCALPHA,也就是直接使用alpha值,第二行指定目标像素的alpha因子,这里是D3DBLEND_INVSRCALPHA,相当于1 - alpha,最后一行是混合类型,这里是D3DBLENDOP_ADD,相加,所以最终的计算公式就是

OutputPixel = sourceColor * alpha + destColor * (1 - alpha)

在这里,源像素是指当前我们正在绘制的像素,而目标像素是指已经绘制到backbuffer中的像素。

// Set the color to come completely from the diffuse
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);   //Ignored
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,    D3DTOP_SELECTARG1);//Set the alpha to come completely from the diffuse
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);   //Ignored
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,    D3DTOP_SELECTARG1);// blend
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,    D3DBLEND_SRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,    D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_BLENDOP,    D3DBLENDOP_ADD);

效果图

Happy coding!!!

==

本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2012/08/27/2654828.html,如需转载请自行联系原作者

Alpha混合(二)Material Alpha相关推荐

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

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917 作者:毛星 ...

  2. alpha混合原理(2)

    alpha混合原理 在前面介绍的示例程序中,绘制图形的颜色总是替换当前颜色缓冲区中存在的颜色,这样后面的物体总是覆盖在原有的物体上.但是当想要绘制类似于玻璃.水等具有透明效果的物体时,这种方法显然满足 ...

  3. Alpha混合:一个颜色上覆盖另一个透明颜色

    事情起因本来是这样的,我在网站里加了一张纯色的图片,颜色是#EFCAC3 结果网站上呈现出来的时候变色了???变成了#A78D88. 一脸懵逼,然后我打开控制台看了一下,页面上其有一条rgba(0,0 ...

  4. 深度测试与alpha混合(1)

    深度测试与alpha混合(1) 在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试.半透明物体的绘制不同于不透明物体,Direct3D通过alp ...

  5. DirectX9.0 (10) Alpha混合

    引言 在前面几篇博文中,已经陆续讲解了光照处理,和纹理映射的内容.现在来讲解一些更有趣的东西.Alpha混合,总是出现在各种各样的游戏中.我们无时无刻都在和它进行打交道,所以很有必要掌握如何进行Alp ...

  6. Windows的位图alpha混合技术

    摘 要:本文介绍了在Windows环境下对位图的图像alpha混合技术,提供了alpha混合函数的实现方法,并对Windows API提供的alpha混合函数的使用进行了介绍. 关键词:Windows ...

  7. OpenGL纹理矩阵,alpha混合和丢弃

    OpenGL纹理矩阵,alpha混合和丢弃 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include &q ...

  8. 【STM32F429开发板用户手册】第46章 STM32F429的DMA2D应用之刷色块,位图和Alpha混合

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第46章       STM32F429的DMA2D应用之刷色块, ...

  9. 多张图片合成一张图片(alpha混合)

    代码:         CCImage* body = new CCImage();         body->initWithImageFile("b.png", CCI ...

最新文章

  1. 北航云计算公开课 01 Introduction to Cloud Computing
  2. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
  3. 解决ubuntu系统中输入sudo passwd root,之后,提示输入新密码时,输不进去
  4. 解决:VScode 汉化后 、设置中文后 还显示英文的问题
  5. html的表格使用函数,从另一个HTML表格创建HTML表格的jQuery函数
  6. SQLServer2000同步复制技术实现步骤作者
  7. android 使用pdf文件大小,Android 加载PDF文件的使用
  8. RedHat 设置IP、网关、DNS
  9. Android 返回键的处理
  10. wall 广播发送信息给所有user
  11. 计算机进管理提示找不到入口,如何解决Win10提示找不到入口点dllregisterserver
  12. [1077]ZooKeeper下载安装(Windows版本)
  13. centos 防火墙关闭 不能访问3306端口
  14. (Python高级编程)第二章:Python中的魔法函数
  15. mybatis-plus乐观锁配置
  16. 未来智安XDR及核心组件产品上榜《嘶吼2022网络安全产业图谱》
  17. 一窥深度学习黑箱,拼接深层神经网络架构
  18. Java使用poi做加自定义注解实现对象与Excel相互转换
  19. java simsimi_“小黄鸡”中文聊天机器人的详细说明.
  20. Linux基础第二章:文件压缩归档及文本编辑

热门文章

  1. AgileEAS.NET SOA 中间件Web运行容器管理功能已全部开源,欢迎大家下载、使用、反馈...
  2. linux面试题与参考答案(转)
  3. 信息安全风险评估项目工序与流程
  4. mysql ddl 进度_MySQL5.7 慢查询+DDL操作堵塞查询
  5. 使用nginx负载均衡的webservice wsdl访问不到_谁说前端不用懂,Nginx 反向代理与负载均衡(超实用)...
  6. 广西大学计算机英语复试的内容,广西大学计算机专业的研究生复试时
  7. 深入理解ThreadLocal变量的功能和使用
  8. 10个前端开发人员必须知道的CSS框架
  9. 刷新按钮_处理数据透视表的隐藏选项(四):固定报表刷新前后的列宽和格式...
  10. java中怎样创建线程_java中的线程创建和使用