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.hqwc.cn/news/168519.html

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

相关文章

debian/ubuntu/windows配置wiregurad内网服务器(包含掉线自启动)

文章目录 前言一、服务器配置安装wireguard软件生成私钥公钥配置服务器参数配置服务器sysctl参数启动、停止服务端 二、用户端配置安装wireguard软件生成私钥公钥配置客户端参数启动、停止客户端配置服务开机启动 三、服务器添加、删除客户四、配置掉线自启动配置掉线自启动脚本…

凯美瑞 vs 太空船:Web3 游戏生长的两条路径

撰文&#xff1a;Teng Yan&#xff08;0xPrismatic&#xff09;&#xff0c;Delphi Digital 研究员 编译&#xff1a;TinTinLand 来源&#xff1a;https://0xprismatic.substack.com/p/my-short-web3-gaming-thesis 经常有人问我关于 Web3 游戏的看法&#xff0c;所以我想以这…

【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队

一、 一条简单SQL在MySQL执行过程 一张简单的图说明下&#xff0c;MySQL架构有哪些组件和组建间关系&#xff0c;接下来给大家用SQL语句分析 例如如下SQL语句 SELECT department_id FROM employee WHERE name Lucy AND age > 18 GROUP BY department_id其中name为索引&a…

深度学习_10_softmax_实战

由于网上代码的画图功能是基于jupyter记事本&#xff0c;而我用的是pycham,这导致画图代码不兼容pycharm,所以删去部分代码&#xff0c;以便能更好的在pycharm上运行 完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合"…

Rocky Linux 配置邮件发送

Rocky Linux 配置邮件发送 使用自己的有邮箱发送 第一步-开启STMP授权 首先要开启STMP授权码&#xff0c;以QQ邮箱为例 第二步-下载安装包 说明一点不用命令行安装也可以&#xff0c;在命令行中输入会提示你是否安装s-nail&#xff0c;一直y即可 mail下载必须要的安装包 …

数据结构与算法C语言版学习笔记(6)-树、二叉树、赫夫曼树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树的定义1.结点的度、树的度2.结点的逻辑关系3.树的深度4.有序树和无序树5.森林 二、树的存储结构&#xff08;1&#xff09;双亲表示法&#xff08;2&…

leetcode(力扣) 207. 课程表1+2(图的构造与遍历,清晰思路,完整模拟)

文章目录 题目描述思路分析完整代码 题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学…

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

轻量日志管理方案-[EFK]

使用FileBeat进行日志文件的数据收集&#xff0c;并发送到ES进行存储&#xff0c;最后Kibana进行查看展示&#xff1b; 这个应该是最简单&#xff0c;轻量的日志收集方案了。 最总方案为&#xff1a;FileBeatESKibana ; 【Kibana过于强大&#xff0c;感觉可以无限扩展】 文章目…

Apinto 网关进阶教程,使用 API Mock 生成模拟数据

什么是 API Mock &#xff1f; API Mock 是一种技术&#xff0c;它允许程序员在不依赖后端数据的情况下&#xff0c;模拟 web服务器端 API 的响应。通常使用 API Mock 来测试前端应用程序&#xff0c;而无需等待后端程序构建完成。API Mock 可以模拟任何 HTTP 请求方法&#x…

linux安装nodejs

写在前面 因为工作需要&#xff0c;需要使用到nodejs&#xff0c;所以这里简单记录下学习过程。 1&#xff1a;安装 wget https://nodejs.org/dist/v14.17.4/node-v14.17.4-linux-x64.tar.xz tar xf node-v14.17.4-linux-x64.tar.xz mkdir /usr/local/lib/node // 这一步骤根…