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

相关文章
|
9月前
|
存储 人工智能 算法
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(二)
  博弈树(Game Tree)是博弈论中的一个概念,用于表示博弈过程中的各种可能走法和对应的结果。它是树结构,树的每个节点表示游戏的一个状态,每个节点的子节点表示在该状态下可能的下一步行动。
148 0
|
9月前
|
人工智能 算法 决策智能
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(一)
市面上比较常用的五子棋算法是博弈树极大极小值alpha-beta剪枝算法,该算法可以分成四个部分来讲解,它们是环环相扣的:博弈树 - 极大极小值搜索 - 负值极大法 - alpha&beta剪枝 。
373 0
|
1月前
|
计算机视觉
图像处理之透明混合 - Alpha Blending效果
图像处理之透明混合 - Alpha Blending效果
13 0
|
2月前
|
数据采集 人工智能 计算机视觉
CLIP的升级版Alpha-CLIP:区域感知创新与精细控制
为了增强CLIP在图像理解和编辑方面的能力,上海交通大学、复旦大学、香港中文大学、上海人工智能实验室、澳门大学以及MThreads Inc.等知名机构共同合作推出了Alpha-CLIP。这一创新性的突破旨在克服CLIP的局限性,通过赋予其识别特定区域(由点、笔画或掩码定义)的能力。Alpha-CLIP不仅保留了CLIP的视觉识别能力,而且实现了对图像内容强调的精确控制,使其在各种下游任务中表现出色。
118 1
|
iOS开发
iOS开发-Opaque、Alpha、Hidden区别
在UIView中,有段时间Alpha,Hidden用的比较多,Opaque是最近才了解的,感觉有些不好理解于是就将这三个属性做了区分: 属性: 1、Alpha(不透明度) 2、Hidden(隐藏) 3、Opaque(不透明的) 1、Alpha(不透明度)
408 0
|
移动开发 小程序 Android开发
从 Alpha 到 Beta,这次是 New mPaaS
新官网 新视觉 新容器
1060 0
从 Alpha 到 Beta,这次是 New mPaaS