Alpha混合(一)Vertex Alpha

简介:

Vertex alpha

Alpha混合通常是为了实现透明效果,透明效果的程度通过alpha值来控制,对于一个8bit的alpha chanel,可以产生0-255级透明效果,0表示完全透明,255表示完全不透明,在D3D中alpha值的来源主要有三种

  • 顶点
  • 材质
  • 纹理

今天介绍如何使用顶点的alpha值来实现透明效果,为了简化程序,我们使用顶点的alpha值来控制顶点的颜色,不涉及到纹理。关于如何使用material alpha及Texture alpha将在后续的篇章中介绍。

定义顶点格式

我们使用Lit顶点格式,也就是无需光照,顶点本身包含颜色值,所以顶点格式如下。

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

定义顶点

{ 0.0f, 0.0f, -1.0f, 0x8000ff00 };

这里只选取一个顶点作为示例。前三个值表示顶点的位置,最后一个值表示顶点的颜色,在D3D中,颜色用一个DWORD表示,其格式如下,最高位的一个byte表示alpha值,随后三个byte分别表示红绿蓝三原色。每个值的范围都是00-ff(十六进制),即十进制0-255。

所以对于0x8000ff00这个值,80表示alpha值,00ff00表示颜色,显然是绿色。

设置diffuse color的来源为顶点diffuse color

在D3D中,Diffuse color(漫反射颜色)一共有三种来源:

  • D3DMCS_MATERIAL, 使用当前的material颜色
  • D3DMCS_COLOR1      使用顶点的diffuse(漫反射)颜色,这也是D3D的默认值。
  • D3DMCS_COLOR2      使用顶点的specular(镜面反射)颜色

为了使用顶点的alpha值,我们需要将diffuse color的来源设置为D3DMCS_COLOR1。

g_pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );

启用alpha混合功能

g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

设置颜色

下面需要设置一些列的纹理状态,虽然我们只使用顶点,而未使用纹理,但是设置颜色和alpha值都需要通过纹理状态函数来完成。这段代码的意义是先选择两个颜色来源,然后指定一个施加在这两个颜色上的操作,从代码可知,第一个颜色是顶点的颜色,第二个是纹理的颜色,颜色操作是D3DTOP_SELECTARG1,也就是直接选择第一个颜色(顶点颜色)。纹理颜色被丢弃,所以第二行可有可无。

//Set the color to come completely from the vertex color
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);

设置alpha值

下面这段代码和上面设置颜色的代码道理相同,选择两个alpha值来源,然后指定一个施加在两个alpha值上的操作,这里同样只选择顶点的alpha值,因为我们就是想使用它!

//Set the alpha to come completely from the vertex 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);

混合

混合公式

OutputPixel = SourcePixel  SourceBlendFactor + DestPixel  DestBlendFactor

  • OutputPixel—混合后的颜色

  • SourcePixel—源像素,即当前正在计算的像素的颜色

  • SourceBlendFactor—源颜色的百分比

  • DestPixel—目标像素,即已经绘制的像素颜色(在back buffer中)

  • DestBlendFactor—目标像素颜色的百分比

表示分量乘积

真正的混合操作由下面的代码完成,第一行指定源像素的混合因子,这里是D3DBLEND_SRCALPHA,也就是使用顶点的alpha值,源像素即当前正在计算的像素,第二行指定目标像素的混合因子,这里是D3DBLEND_INVSRCALPHA,也就是1减去顶点的alpha值。目标像素是指当前已经绘制在backbuffer中的像素,由于我们只绘制了一个物体,所以目标像素为空。第三行是混合操作,相加,这也是D3D的默认值。

复制代码
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

 

复制代码

效果图

下面是使用Vertex alpha和Vertex color混合的结果,根据alpha值的不同,可以产生不同级别的透明效果,这四幅图的alpha值依次是20, 80, C0和FF。

Happy coding!!!

==


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

相关文章
|
6月前
|
存储 人工智能 算法
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(二)
  博弈树(Game Tree)是博弈论中的一个概念,用于表示博弈过程中的各种可能走法和对应的结果。它是树结构,树的每个节点表示游戏的一个状态,每个节点的子节点表示在该状态下可能的下一步行动。
116 0
|
6月前
|
人工智能 算法 决策智能
【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法(一)
市面上比较常用的五子棋算法是博弈树极大极小值alpha-beta剪枝算法,该算法可以分成四个部分来讲解,它们是环环相扣的:博弈树 - 极大极小值搜索 - 负值极大法 - alpha&beta剪枝 。
230 0
|
1月前
|
计算机视觉
halcon系列基础之Scale_image_range
halcon系列基础之Scale_image_range
|
4月前
|
数据采集 人工智能 计算机视觉
CLIP的升级版Alpha-CLIP:区域感知创新与精细控制
为了增强CLIP在图像理解和编辑方面的能力,上海交通大学、复旦大学、香港中文大学、上海人工智能实验室、澳门大学以及MThreads Inc.等知名机构共同合作推出了Alpha-CLIP。这一创新性的突破旨在克服CLIP的局限性,通过赋予其识别特定区域(由点、笔画或掩码定义)的能力。Alpha-CLIP不仅保留了CLIP的视觉识别能力,而且实现了对图像内容强调的精确控制,使其在各种下游任务中表现出色。
85 1
|
并行计算 iOS开发 MacOS
Metal每日分享,调整灰度系数gamma滤镜效果
Metal每日分享,调整灰度系数gamma滤镜效果
Metal每日分享,调整灰度系数gamma滤镜效果
|
移动开发 小程序 Android开发
从 Alpha 到 Beta,这次是 New mPaaS
新官网 新视觉 新容器
1047 0
从 Alpha 到 Beta,这次是 New mPaaS
旋转矩阵(Rotation Matrix)的推导及其应用
向量的平移,比较简单。   缩放也较为简单   矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片搜索旋转矩阵时,看到这张动图,觉得表述的很清晰了。     稍微复杂一点的是旋转,如果只是二维也很简单(因为很直观),但因为是三维的,有xyz三个轴,先推导二维的再延伸到三维。
4763 0