Alpha混合(二)Material Alpha

简介:

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,如需转载请自行联系原作者

相关文章
|
12月前
|
JSON API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API
151 6
|
11月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
11月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
744 1
|
11月前
|
Ubuntu API Python
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
335 1
|
10月前
|
人工智能 供应链 数据挖掘
跨境电商目前现状
2024年,跨境电商市场持续增长,全球市场规模预计达2.1万亿美元,中国跨境电商进出口额达1.22万亿元。行业竞争加剧,技术创新和政策支持成为重要推动力。市场多元化趋势明显,新兴市场增长迅速,销售渠道多样化,但海外政策调整带来一定挑战。
|
12月前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
365 3
|
机器学习/深度学习 Ubuntu KVM
ubuntu启动emulator : /dev/kvm is not found: VT disabled in BIOS or KVM kernel module not loaded
本文记录了解决AOSP模拟器无法启动的问题,原因是微星B450M主板BIOS中虚拟化技术未开启,通过安装KVM模块并修改BIOS设置以启用SVM模式来解决。
480 0
ubuntu启动emulator : /dev/kvm is not found: VT disabled in BIOS or KVM kernel module not loaded
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中的距离度量有哪些及公式表示?
聚类算法中常用的距离度量方法及其数学表达式,包括欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等多种距离和相似度计算方式。
1080 1
|
JSON 前端开发 JavaScript
使用JavaScript制作一个简单的天气应用
使用JavaScript制作一个简单的天气应用
|
安全 前端开发 Unix
网站建设常用的cms建站系统推荐
国内网站建设市场参差不齐,建站公司多如牛毛,网站价格便宜的几百,贵的几十万,作为外行,很难去选择,国内大部分网站建设公司都是营销公司,完全没有底层技术框架的开发能力,90%以上的网站建设公司都是基于各种cms网站内容管理系统来制作网站,七牛云小编根据最近服务器各种cms的安装量,统计国内用户比较多的几个cms,并分别介绍,希望对从事网站建设的朋友能起到参考作用
435 0
网站建设常用的cms建站系统推荐