Direct3D融合技术

2023-09-21 18:30:06

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合),利用该技术我们可得到各种各样的效果,尤其是透明效果。

在融合运算时需要遵循:首先绘制那些不需要进行融合的物体,然后将需要进行融合的物体按照相对于摄像机的深度值进行排序,如果物体已处于观察坐标系中,该运算的效率会相当高,因为此时只需要对Z分量进行排序,最后按照自后往前的顺序逐个绘制将要进行融合运算的物体。

融合处理公式

OutputPixel=SourcePixel\bigotimes SourceBlendFactor+DestPixel\bigotimes DestBlendFactor

这个公式中每个变量都是一个4D颜色向量(r,g,b,a),中间符号表示分量逐个相乘

OutpurPixel:融合后的颜色值
SourcePixel:当前计算得到的、用于与后台缓存中对应像素进行融合的像素颜色值
SourceBlendFactor:源融合因子,指定了源像素的颜色值在融合中所占比例,该值在区间[0,1]
DestPixel:当前处于后台缓存中的像素颜色值
DestBlendFactor:目标融合因子,指定了目标像素的颜色值在融合中所占的比例,该值在区间[0,1]内

源融合因子和目标融合因子使我们可以各种方式修改源像素和目标像素的颜色值,从而获得各种不同的效果,Direct3D中默认状态下是禁止融合运算的,可将绘制状态D3DRS_ALPHABLENDENABLE设为true便启用了融合运算,融合计算的开销并不低,所以应该仅在必需的场合中使用,当绘制完需要进行融合的几何体之后,应禁止Alpha融合,在对三角形单元组进行融合时,最好进行批处理,之后应立即绘制出来,这样就可避免在每帧图像中都启用了禁止融合运算。

Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

//融合运算  Draw...

Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

融合因子

可通过设置绘制状态D3DRS_SRCBLEND和D3DRS_DESTBLEND的值来对源融合因子和目标融合因子分别进行设定。

//Source、Destination  填D3DBLEND枚举
Device->SetRenderState(D3DRS_SRCBLEND, Source);
Device->SetRenderState(D3DRS_DESTBLEND, Destination);

透明度

每个顶点颜色中的Alpha分量与颜色值类似,都是沿着三角形到单元表面渐变的,但它并非用于确定某像素的颜色值,而是用于确定像素的Alpha分量,Alpha分量主要用于指定像素的透明度,假定为每个像素的Alpha分量保留8位,则合法区间为[0,255],Alpha为0时元素完全透明,为255则完全不透明,为了能使Alpha分量来秒后苏像素的透明度,必须将融合因子和目标融合因子分辨设置为D3DBLEND_SRCALLPHA和D3DBLEND_INVSRCALPHA,这些值恰好也是融合因子的默认值。

Alpha通道

我们并不直接使用计算得到Alpha分量,而往往是从纹理的Alpha通道中获取Alpha信息,Alpha通道是保留给存储了Alpha分量的纹理元的一个额外的位集合,当纹理映射到某个图元中时,Alpha通道中的Alpha分量也进行了映射,并成为了该图元中像素的Alpha分量。

指定Alpha来源

默认状态下,如果当前设置的纹理拥有一个Alpha通道,Alpha值就取自该Alpha通道,如果没有Alpha通道,Alpha值就取自顶点的颜色,也可以用下列绘制状态来指定Alpha值的来源(漫反射颜色值或Alpha通道)

//漫反射颜色值
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

//纹理的Alpha通道
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

用DirectX Texture Tool创建Alpha通道

最常见的图像文件格式中不含有Alpha信息,可以用DirectX纹理工具创建一个具有Alpha通道的DDS文件,DDS文件是一种专门为DirectX应用程序和纹理设计的图像格式。可使用D3DXCreateTextureFromFile函数将DDS文件加载到纹理中。

使用该工具打开图片后会自动加载为24位的RGB纹理(红、绿、蓝分量各占8位),如果想扩展为32位的ARGB格式的纹理,选择菜单中Format然后选择Change Surface Format命令,选择A8R8G8B8格式并确定就创建了一幅像素颜色深度为32位的图像,接下来的任务是将数据加载到Alpha通道中,选择菜单File,然后选择Open Onto Alpha Channel Of This Texture命令,找到要加载到该Alpha通道的数据的图像文件后就完成在Alpha通道作用下的纹理图了,保存后命名为xxx.dds

更多推荐

【iOS】浅析static,const,extern关键字

文章目录前言一、staticstatic修饰局部变量static修饰全局变量总结二、const三、extern声明全局变量声明函数在头文件中使用总结前言笔者本周在学习单例模式时,用到了static关键字,特此总结博客记录学习static,const,extern关键字的过程一、staticstatic——静态,我们将用

【golang】实现通用的get/post请求(接受一个 URL 和一个结构体参数)

通用的GET请求实现一个通用的GET请求函数,该函数接受一个URL和一个结构体参数,并将结构体参数编码为查询参数。以下是一个通用的示例代码:packagemainimport("fmt""net/http""net/url""reflect""strings")funcgetFunc(baseUrlstring,str

Learn Prompt-ChatGPT 精选案例:简单介绍

恭喜你!现在你已经学会了如何编写提示语。本节主要讨论的是如何使用提示语来解决我们在日常或工作中遇到的任务。如果你已经有了一个提示语集,如何决定哪些提示语适合手头的任务?在本节中,我们将通过一些实际例子来给你提供灵感。在挑选案例的时候,我们更加希望展示的是如何将复杂的工作任务拆解成相互关联的小任务。例如在PPT制作中,我

【C++代码】平衡二叉树,二叉树的所有路径,左叶子之和--代码随想录

题目:平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。题解这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉

解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误

目录问题背景解决方案如何重置MySQLroot密码:问题背景java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLExc

CSS复习之选择器

目录一、常用选择器1.1元素选择器1.2id选择器1.3class选择器二、复合选择器2.1交集选择器2.2并集选择器三、关系选择器3.1子元素选择器3.2后代选择器3.3兄弟选择器四、属性选择器五、伪类选择器六、伪元素的选择器七、超链接的伪类一、常用选择器1.1元素选择器作用:根据标签名来选中指定的元素语法:标签名{

固定资产管理措施怎么写

固定资产管理措施是指企业在进行固定资产管理时所采取的各种措施和方法。以下是一些常见的固定资产管理措施:加强固定资产的安全保护。该公司采取了多种安全措施建立完善的固定资产管理制度。制定明确的资产采购、使用、维护、报废等流程和标准,确保资产管理的规范性和透明度。采用先进的资产管理软件。通过数字化手段对固定资产进行管理和监控

unity打包后无法读取Excel解决方法

一、前言最近几乎遇到了所有能遇到的unity读取Excel的问题。因为使用的是unity5.4,而且还是32位。所以出现各种问题在所难免。废话不多说,现有的现象是:在unity的编辑器里可以完美运行,读取Excel不成问题,但是打包成exe后就无法读取到对应路径下的Excel表格了。二、解决办法第一种,未能解决:在脚本

BANI时代下,项目如何实现价值交付?

随着时代的变化,继VUCA时代后、新的语言出现:BANI一词逐渐流行起来。BANI,取自四个英文单词Brittle(脆弱的)、Anxious(焦虑的)、Nonlionear(非线性的)、Incomprehensible(费解的)首字母的大写。Brittleness(脆弱性):在BANI时代,系统和组织可能会突然、且无预

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册晨控CK-FR102AN系列是一款基于射频识别技术的高频双通道读写器,读写器工作频率为13.56MHZ,支持对I-CODE2、I-CODESLI等符合ISO15693国际标准协议格式标签的读取。高频双通道读写器支持标准工业通讯协议ModbusTCP,

Arduino程序设计(十一)8×8 共阳极LED点阵显示(74HC595)

8×8共阳极LED点阵显示前言一、74HC595点阵模块1、74HC595介绍2、74HC595工作原理3、1088BS介绍4、74HC595点阵模块二、点阵显示实验1、点阵显示初探2、点阵显示进阶3、点阵显示高阶3.1点阵显示汉字(方法1)3.2点阵显示汉字(方法2)补充前言本文主要介绍8×8共阳极LED点阵显示实验

热文推荐