Alpha混合(一)Vertex Alpha

2024-01-27 04:38
文章标签 混合 alpha vertex

本文主要是介绍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!!!

这篇关于Alpha混合(一)Vertex Alpha的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649081

相关文章

Matplotlib图像读取和输出及jpg、png格式对比,及透明通道alpha设置

图像像素值 图像像素值一般size为3,也就是通道数,分别代表R,G,B,如果只有单一 一个值则表示灰度值,也就是说一张二维图片,当长和宽都为1080时,那么若是灰度图像,图像尺寸为(1080,1080,1)若是RGB图像则为(1080,1080,3), jpg、png图像格式 jpg图像的灰度值范围和RGB范围为[0,255],数值类型为uint8,也就是无符号整数 png图像的灰度值范

Kubernetes的alpha.kubernetes.io/nvidia-gpu无法限制GPU个数

问题描述: Pod.yaml文件中关于GPU资源的设置如下: 然而在docker中运行GPU程序时,发现宿主机上的两块GPU都在跑。甚至在yaml文件中删除关于GPU的请求,在docker中都可以运行GPU。 原因: 上例说明alpha.kubernetes.io/nvidia-gpu无效。查看yaml文件,发现该docker开启了特权模式(privileged:ture): 而

android xml之动画篇 alpha、scale、translate、rotate、set的属性及用法 和

1.简介 Android的补间动画TweenAnimation由四种类型组成:alpha、scale、translate、rotate,对应android官方文档地址:《Animation Resources》 逐帧动画 FrameAnimation(也称 Drawable Animation  ):animation-list alpha 渐变透明度动画效果 scale 渐变

Android AnimationDrawable资源 set[translate,alpha,scale,rotate]

本文内容摘自《疯狂Android讲义 第三版-李刚著作》 xml <?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fillAfter="true"android:f

混合模式属性background-blend-mode

background-blend-mode 是 CSS 中的一个属性,它允许你将背景图像与背景颜色或背景图像之间以一种特定的混合模式进行混合。这个属性为网页设计师提供了一种强大的方式来创建视觉上吸引人的背景效果,无需使用图像编辑软件或额外的图像文件。 background-blend-mode 可以应用于单个背景图像与背景颜色之间,或者当设置多个背景图像时,应用于这些图像之间。混合模式包括了许多

旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP

目录 效果一览基本介绍建模步骤程序设计参考资料 效果一览 基本介绍 混合粒子群算法GA-PSO是一种结合了遗传算法(Genetic Algorithm, GA)和粒子群优化算法(Particle Swarm Optimization, PSO)的优化算法。在解决旅行商问题(Traveling Salesman Problem, TSP)时,这种混合算法可以结合两种算法的优点

【风力发电】基于智能控制器的光伏/风电混合发电系统

摘要 光伏和风力发电因其可再生性和环保性在全球范围内得到了广泛应用。本文提出了一种基于智能控制器的光伏/风电混合发电系统,通过智能控制器对系统的功率输出进行优化管理。实验结果表明,该系统能够在不同的环境条件下高效运行,显著提高了能源利用率和系统稳定性。 理论 光伏/风电混合发电系统结合了太阳能和风能的优势,能够更好地适应不同的气候条件。然而,由于太阳辐射和风速的变化性,这种系统的功率输出

【UVa】 10735 Euler Circuit 混合图的欧拉回路 最大流

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1676 题目要求:求混合图的欧拉回路+输出路径。 题目分析: 先看一段比较流行的说法吧~: -----------------------------------------

深入了解CSS混合模式

CSS混合模式(也称为CSS Blend Modes)是一种强大的功能,它允许开发者在CSS中控制元素如何与它们的背景或其他元素混合。这些模式类似于图像编辑软件(如Photoshop)中的混合模式,使得开发者能够创建出复杂而富有表现力的视觉效果,而无需依赖额外的图像或复杂的JavaScript代码。 CSS混合模式的基础 CSS混合模式是通过mix-blend-mode和background-

高斯混合模型(GMM)的EM算法实现

在 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我们给出了GMM算法的基本模型与似然函数,在EM算法原理中对EM算法的实现与收敛性证明进行了详细说明。本文主要针对如何用EM算法在混合高斯模型下进行聚类进行代码上的分析说明。 GMM模型: 每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“C