Direct3D粒子系统

粒子和点精灵

粒子(是种微小的物体,在数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由
D3 DPRIMITIVETYPE类型的D3 DPT POINTLIST枚举常量表示)是一个很好的选择。但是光栅化时,点图元将被映射为一个单个像素。这样就无法为我们提供很大的灵活性,因为实际应用中我们可能需要各种尺寸的粒子甚至希望能够对这些粒子进行纹理映射。在Direct3D8.0之前,要想摆脱点图元的这个限制,只能是不去使用它。那时,程序员都愿意用广告牌(billboard)技术来显示一个粒子。广告牌就是一个四边形,通过对其自身世界变换矩阵的控制,使其总是面向摄像机。
Direct3D8.0引入了.-种特别的点图元一点精灵(Point Sprite),该图元极适合应用于粒子系统中。与
普通的点图元不同,点精灵可进行纹理映射且其尺寸可变。点精灵也不同于广告牌,描述点精灵时仅需要一个单点即可。由于我们只需要存储和处理一个顶点而非4个(广告牌要用4个顶点描述),这样就节省了内存和宝贵的运算时间。

粒子结构格式

struct Particle
{D3DXVECTOR3	m_position;        //粒子位置D3DCOLOR		m_color;           //粒子颜色//float			m_size;            //粒子尺寸static const DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE /*| D3DFVF_PSIZE*/;
};

_size来表示其尺寸。为了反映该变化,我们必须为灵活顶点格式FVF增加D3DFVF_PSIZE标记。让每个粒子对象维护其自身的尺寸十分有用,因为这就允许我们单独指定或改变某个粒子的尺寸。但由于大多数图形卡都不支持按照这种方式控制粒子的尺寸,所以我们将不采用这种做法。(可检查结构D3DCAPS9种的成员FVFCaps中的D3DFVFCAPS_PSIZE位来验证),我们将通过绘制状态来控制粒子的尺寸,即使硬件不支持D3DFVFCAPS_PSIZE,借助像素着色器(vertex shader)我们也有可能控制每个粒子的尺寸。

需要注意的是粒子结构参数如果定义了,就需要赋值为正确的值,不然可能会绘制不出来粒子,例如加了粒子尺寸字段,但是没有给该字段赋值。

点精灵绘制状态

点精灵的行为大部分由渲染状态来控制

D3DRS_POINTSPRITEENABLE
默认为false,若指定为tue,则规定整个当前纹理被映射到点精灵上。若指定为false,则规定点精灵的纹理坐标所指定的纹理元应被映射到点精灵上。

D3DRS_POINTSCALEENABLE
默认值为false,若指定为true,则规定点的尺寸将用观察坐标系的单位来度量。观察坐标系的单位是仅用来描述摄像机坐标系中的3D点。点精灵的尺寸将依据近大远小的原则进行相应的比例变换。若指定为false,则规定点的尺寸将用屏幕坐标系的单位(即像素)来度量。如果您将该绘制状态指定为false,而且您想将点精灵的尺寸设为3,则点精灵将变为屏幕上一个3×3的像素区域。

D3DRS_POINTSIZE
用于指定点精灵的尺寸。该值可被解释为观察坐标系中的点精灵尺寸,也可被解释为屏幕坐标系中的点精灵尺寸,这主要取决于绘制状态D3DRS_POINTSCALEENABLE的设置。下面的代码将点的尺寸设为2.5个单位。

Device->SetRenderState(D3DRS_POINTSIZE, d3d::FtoDw(2.5f));

D3DRS_POINTSIZE_MIND3DRS_POINTSIZE_MAX
指定点精灵可取的最小/最大尺寸

D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B、D3DRS_POINTSCALE_C
这3个常量控制了点精灵的尺寸如何随距离发生变化,这里的距离是指点精灵到摄像机的距离
给定距离和这些常量时,Direct3D使用如下公式计算点精灵的最终尺寸:FinalSize=ViewportHeight\cdot Size\cdot \sqrt{\frac{1}{A+B(D)+C(D^{2})}}

  • FinalSize:点精灵的最终尺寸
  • ViewportHeight:视口(viewport)高度
  • Size:对应于由绘制状态D3DRS_POINT_SIZE所指定的值
  • A,B,C:分别对应于绘制状态D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B、
    D3DRS_POINTSCALE_C所指定的值
  • D:在观察坐标系中点精灵到摄像机的距离。由于在观察坐标系中,摄像机位于坐标原点,所以D=\sqrt{x^{2}+y^{2}+z^{2}},(x,y,z)为点精灵在观察者坐标系中的位置
Device->SetRenderState(D3DRS_POINTSCALE_A, d3d::FtoDw(0.0f));
Device->SetRenderState(D3DRS_POINTSCALE_B, d3d::FtoDw(0.0f));
Device->SetRenderState(D3DRS_POINTSCALE_C, d3d::FtoDw(1.0f));

粒子及其属性

一个粒除了位置和颜色外往往还具有许多其他的属性。例如粒子可县有一定的速度。但是绘制粒子时并不需要这些附加属性。所以我们将用于绘制粒子的数据与粒子的属性分别存储在两个不同的结
构中。当我们要创建、销毁或更新粒子时,需要涉及粒子的属性,当我们准备绘制粒子时,可将粒子的位置和颜色信息复制到Particle结构中
粒子的属性与所要模拟的粒子系统的特定类型相关。通过指定些常用属性可以使这些属性结构变得通用些。下面是一个包舍了些通用的粒子属性的结构。大多数系统并不需要如此众多的属性,但是有些系统可能还需要附加些其他属性。

struct Attribute
{D3DXVECTOR3 _position;        //粒子在世界坐标系中的位置D3DXVECTOR3 _velocity;        //粒子的速度,单位/秒D3DXVECTOR3 _acceleration;    //粒子的加速度       float _lifeTime;              //粒子自诞生到消亡所需的时间float _age;                   //粒子当前的年龄D3DXCOLOR _color;             //粒子的颜色D3DXCOLOR _colorFade;         //粒子颜色如何随时间渐弱bool _isAlive;                //粒子是否处于活动状态
}

粒子系统的组成

粒子系统是众多粒子的集合,并负责对这些粒了进行维护和显示。粒子系统跟踪系统中影响所有粒子状态的全局属性,例如粒子的尺小、粒子的粒子源、将要映射到粒子的纹理等。按照功能来说,粒子系统主要负责史新(updating)、显示(displaying)、杀死(kil)以及创建(creating)粒子。

class ParticleSystem
{
protected:IDirect3DDevice9*			m_device;			D3DXVECTOR3					m_origin;			//系统粒子源,所有的粒子都将从系统粒子源产生d3d::BoundingBox			m_boundingbox;		//限制粒子的活动范围,超出该外接体的粒子会杀死float						m_emit_rate;		//粒子的增加率,用粒子数/秒来度量float						m_size;				//系统中所有粒子的尺寸IDirect3DTexture9*			m_tex;			IDirect3DVertexBuffer9* 	m_vb;list<ParticleAttribute>		m_particles;		//系统中粒子的属性列表int							m_maxParticles;		//某个给定时间内,系统所允许拥有的最大粒子数DWORD						m_vbSize;			//在一个给定时间顶点缓存中所存储的顶点个数,该值不依赖于粒子系统中实际粒子个数DWORD						m_vbOffset;DWORD						m_vbBatchSize;public:ParticleSystem();virtual ~ParticleSystem();virtual bool init(IDirect3DDevice9*	device, const char* texture_filename);virtual void reset();//重新设定粒子属性virtual 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/188197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从windows iso文件中提取install.wim

1、首先从微软官方下载需要的windows镜像 https://www.microsoft.com/zh-cn/software-download/windows10/ 2、在下载的iso文件右键&#xff0c;打开压缩包&#xff0c;在sources文件夹下&#xff0c;应该就可以看到install.wim了。但似乎在最新的win10版本&#xff0c;微软采…

金字塔原理小节

目录 第1章 为什么要用金字塔结构 一、归类分组&#xff0c;将思想组织成金字塔 二、奇妙的数字“7” 三、归类分组搭建金字塔 四、找出逻辑关系&#xff0c;抽象概括 五、自上而下表达&#xff0c;结论先行 第1章 为什么要用金字塔结构 如果受众希望通过阅读你的文章、听…

Git系列之Git集成开发工具及git扩展使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

【启扬方案】启扬安卓屏一体机在医疗自助服务终端上的应用解决方案

为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通过与医院信息化系统…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

SDWAN(Software Defined Wide Area Network)概述与优势分析

文章目录 SDWAN简介SDWAN技术优势简化网络部署和维护安全传输灵活网络拓扑极致体验 SD-WAN关联技术STUNIPsec智能选路SaaS路径优化 典型组网多总部分支组网云管理组网 推荐阅读 SDWAN简介 SDWAN&#xff08;Software Defined Wide Area Network&#xff0c;软件定义广域网&…

Java TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; impor…

数据分析实战 | K-means算法——蛋白质消费特征分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 ​编辑 八、模型评价 九、模型调参与预测 一、数据及分析对象 txt文件——“protein.txt”&#xff0c;主要记录了25个国家的9个属性&#xff0c;主…

“Redis与Spring整合及缓存优化“

文章目录 引言1. Spring整合Redis1.1. 为什么选择Redis作为缓存解决方案&#xff1f;Redis的特点和优势Redis与传统关系数据库的对比 1.2. Spring与Redis整合的基本步骤 2. Redis注解式缓存2.1. Spring提供的缓存注解介绍2.2. 使用注解实现方法级别的缓存 3. Redis的击穿、穿透…

软件工程的舞台上,《人月神话》的美学纷飞

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天给大家分享一本书&#xff1a;《人月神话》——软件工程的经典之作。 《人月神话》是一本具有深远影响力的软件工程著作&#xff0c;无论是软件开发者、管理者还是学习软件工程的人士&#xff0c;都能从中获得宝贵的启…

Aspose.OCR for .NET 2023Crack

Aspose.OCR for .NET 2023Crack 为.NET在图片上播放OCR使所有用户和程序员都可以从特定的图像片段中提取文本和相关的细节&#xff0c;如字体、设计以及书写位置。这一特定属性为OCR的性能及其在扫描遵循排列的记录时的功能提供了动力。OCR的库使用一条线甚至几条线来处理这些特…

3.30每日一题(多元函数微分学)

1、判断连续&#xff1a;再分界点的极限值等于该点的函数值&#xff1b; 如何求极限值&#xff1a; 初步判断&#xff1a;分母都为二次幂开根号&#xff0c;所以分母为一次幂&#xff1b;分子为二次&#xff0c;一般来说整体为0&#xff1b; 如何说明极限为零&#xff08;常用…

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速&#xff0c;人像采集在金融机构身份认证领域中发挥重要作用&#xff0c;为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面&#xff1a; 身份盗用和欺诈风险&#xff1a;传统身份验证方式可能存在漏洞&am…

react+星火大模型,构建上下文ai问答页面(可扩展)

前言 最近写的开源项目核心功能跑通了&#xff0c;前两天突发奇想。关于项目可否介入大模型来辅助用户使用平台&#xff0c;就跑去研究了最近比较活火的国内大模型–讯飞星火大模型。 大模型api获取 控制台登录 地址&#xff1a;https://console.xfyun.cn/app/myapp 新建应…

Leetcode2833. 距离原点最远的点

Every day a Leetcode 题目来源&#xff1a;2833. 距离原点最远的点 解法1&#xff1a;贪心 要使得到达的距离原点最远的点&#xff0c;就看 left 和 right 谁大&#xff0c;将 left 和 right 作为矢量相加&#xff0c;再往同方向加上 underline。 答案即为 abs(left - rig…

使用Dockerfile依赖maven基础镜像部署springboot的程序案例

1、准备springboot Demo代码 就一个controller层代码&#xff0c;返回当前时间及hello world 2、项目根目录下&#xff0c;新建DockerFile文件 注意&#xff0c;等本地配置完毕后&#xff0c;Dockerfile文件需要与项目helloworld同级&#xff0c;这里先放项目里面 3、docker …

利用MSF设置代理

1、介绍&#xff1a; 通过MSF拿到一个机器的权限后&#xff0c;通过MSF搭建socks代理&#xff0c;然后通内网。 拿到目标权限&#xff0c;有很多方法&#xff0c;比如&#xff1a;①ms17-010 ②补丁漏洞 ③MSF生成后门 在此直接使用MSF生成后门 MSF中有三个代理模块&#x…

基于springboot+vue的校园闲置物品交易系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 项目介绍 本文从管…

[架构之路-246]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:获取、分析、定义、验证

目录 前言&#xff1a; 架构师为什么需要了解需求分析 一、需求工程概述 1.1 概述 1.2 需求工程的两大部分 &#xff08;1&#xff09;需求开发&#xff1a;系统工程师的职责、目标系统开发角度 &#xff08;2&#xff09;需求管理&#xff1a;项目管理者的职责、项目管…

物业管理服务预约小程序的效果如何

物业所涵盖的场景比较多&#xff0c;如小区住宅、办公楼、医院、度假区等&#xff0c;而所涵盖的业务也非常广&#xff0c;而在实际管理中&#xff0c;无论对外还是对内也存在一定难题&#xff1a; 1、品牌展示难、内部管理难 物业需求度比较广&#xff0c;设置跨区域也可以&…