Direct3D融合技术

news/2024/11/30 9:37:25/

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

在融合运算时需要遵循:首先绘制那些不需要进行融合的物体,然后将需要进行融合的物体按照相对于摄像机的深度值进行排序,如果物体已处于观察坐标系中,该运算的效率会相当高,因为此时只需要对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_SRCBLENDD3DRS_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_SRCALPHAD3DBLEND_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


http://www.ppmy.cn/news/1129186.html

相关文章

第2章 算法

2.1 开场白 2.2 数据结构与算法之间的关系 在“数据结构”课程中,就算谈到算法,也是为了帮助理解好数据结构,并不会详细谈及算法的方方面面。 2.3 两种算法的比较 2.4 算法的定义 算法是解决特定问题求解步骤的描述,在计算机…

使用c++实现输出爱心(软件:visual Studio)

#include <iostream> using namespace std;int main() {//爱心曲线方程(x^2y^2-a)^3-x^2*y30double a 0.5;//定义绘图边界double bound 1.3 * sqrt(a);//x,y坐标变化步长double step 0.05;//二维扫描所有点,外层逐层扫描for (double y bound; y > -bound; y - ste…

传统安防音视频平台架构

内部级联,为上下级均为自己平台海康子进程调用海康的设备SDKPTPCS通过封装代理不同的私有协议的差异,封装为大华统一的三代协议PC客户端通过调用平台SDKCMS一般采用双机热备技术PTPCS系统一般采用Windows嵌入式,由于部分设备厂家提供的SDK只有Windows的服务和服务之间的调用通过…

Chrome(谷歌浏览器)如何关闭搜索栏历史记录

目录 问题描述解决方法插件解决&#xff08;亲测有效&#xff09;自带设置解决步骤首先打开 地址 输入&#xff1a;chrome://flags关闭浏览器&#xff0c;重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器&#xff0c;但是搜索栏的历史记录如何自己一条条的删…

flutter 递归

if (!Global.wsImMessageQueueState) {Global.wsImMessageQueueState true;startProcessingMessageQueue(true);//开始执行}startProcessingMessageQueue(bool isExistMessage) {if (isExistMessage) {if (Global.wsImMessageQueue.isNotEmpty) {PrintUtil.prints(WsIm消息队列…

python魔术方法详解

一、概述 一直搞不懂python类实例化后内部的函数是怎么自动执行的&#xff0c;原来是通过自定义的魔术方法&#xff08;magic method&#xff09;自动执行 二、魔术方法 2.1什么是魔术方法 在python声明的Class中&#xff0c;凡是以双"__"下划线命名的函数&#…

历史服务器

二、配置历史服务器 在spark-3.1.1-bin-hadoop2.7/conf/spark-defaults.conf添加以下配置&#xff0c;其中d:/log/spark为日志保存位置 spark.eventLog.enabled true spark.eventLog.dir file:///d:/log/spark spark.eventLog.compress true spark.history.fs.logDirectory fil…

简化任务调度与管理:详解XXL-Job及Docker Compose安装

在现代应用程序开发中&#xff0c;任务调度和管理是至关重要的一部分。XXL-Job是一个强大的分布式任务调度平台&#xff0c;它使得任务的调度和管理变得更加轻松和高效。本文将介绍XXL-Job的基本概念&#xff0c;并详细演示如何使用Docker Compose进行快速安装和配置。 什么是X…