Direct3D粒子系统

news2024/11/22 17:56:12

粒子和点精灵

粒子(是种微小的物体,在数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由
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*

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

t2017递推3骨牌

答案&#xff1a; #include<iostream> using namespace std; long long n,s[10009]; int main() {cin>>n;s[1]1,s[2]2,s[3]4;if(n1){cout<<1;return 0;}if(n2){cout<<2;return 0;}if(n3){cout<<4;return 0;}for(int i4;i<n;i)s[i]s[i-1]s[i…

某卢小说网站登录密码逆向

js逆向&#xff0c;今晚找了一个小说网站&#xff0c;分析一下登录密码的解密逆向过程&#xff0c;过程不是很难&#xff0c;分享下 学习网站aHR0cHM6Ly91LmZhbG9vLmNvbS9yZWdpc3QvbG9naW4uYXNweA 这个就是加密后的密码&#xff0c;今晚就逆向它&#xff0c;其他参数暂时不研究…

每日一练:使用Python计算从m到n的累加和

设计思路 可以定义一个函数来计算从m到n的整数累加和&#xff0c;这个函数会接受两个参数&#xff1a;m和n&#xff0c;然后通过使用for循环和range函数&#xff0c;遍历从m到n&#xff08;包括n&#xff09;的所有整数&#xff0c;并将它们加起来。 代码实现 def sum_of_nu…

如何使用Docker搭建Drupal内容管理系统并远程访问

🎬 鸽芷咕:个人主页 🔥个人专栏:《Linux深造日志》《C++干货基地》⛺️生活的理想,就是为了理想的生活! 文章目录前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址📝全篇总结 前言…

linux 操作系统

先讲一下叭&#xff0c;自己学这的原因&#xff0c;是因为我在做项目的时候使用到啦Redis&#xff0c;其实在windows系统上我其实也装啦Redis上&#xff0c;但是我觉得后期在做其他的项目的时候可能也会用到这个然后就想着要不先学学redis&#xff0c;然后在后面也不至于什么都…

文件管理技巧:如何利用文件名关键字进行整理

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;这些文件可能包含各种类型的信息&#xff0c;如文本、图像、视频、音频等。如何有效地管理和整理这些文件&#xff0c;以便我们能够快速找到所需的文件&#xff0c;是一个非常重要的问题。本文将介绍一种…

ChatGPT是什么?黑客试图淹没其服务

上线2个月&#xff0c;月活跃用户破亿&#xff0c;媒体人用它编辑文案&#xff0c;学生用它写作业&#xff0c;程序员用它编辑代码&#xff0c; 它是谁呢&#xff1f; 它就是火爆全网&#xff08;chatgpt&#xff09;,chatgpt是什么呢&#xff0c;chatgpt是美国研发的一款人工…

AI:77-基于深度学习的工业缺陷检测

🚀 本文选自专栏:人工智能领域200例教程专栏 《人工智能领域200例教程专栏》从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,通过本专栏案例和项目实践,都有参考学习意义。每篇案例都包含代码实例,详细讲解供大家学习。 ✨✨✨ 每一个案例都附带有代码,在本…

YOLOCS:有效降低特征图空间复杂度

论文地址&#xff1a;YOLOCS: Object Detection based on Dense Channel Compression for Feature Spatial Solidification (arxiv.org) 通过压缩特征图的空间分辨率&#xff0c;提高了对象检测的准确性和速度。本文的主要贡献在于引入了一种新的特征空间固化方法&#xff0c;…

SOLIDWORKS 2024新功能之Visualize篇

SOLIDWORKS 2024新功能Visualize 增强了创建引人注目的外观的功能 SOLIDWORKS Visualize 使用 Dassault Systmes 的企业 PBR 着色模型 (DSPBR) 来准确复制金属、玻璃、塑料和其他曲面的逼真外观。 DSPBR 是材料模型&#xff0c;用于基于物理的渲染&#xff0c;受 3DEXPERIENCE…

java数据结构--优先级队列

一.概念 优先级队列是一种特殊类型的队列&#xff0c;它根据每个元素的优先级进行排序和访问。较高优先级的元素将在较低优先级的元素之前被处理。 优先级队列可以使用不同的数据结构实现&#xff0c;包括数组、链表或二叉堆。其中&#xff0c;二叉堆是实现优先级队列的常见选…

在已有的虚拟环境中升级python版本

对于现有的虚拟环境&#xff0c;想升级python版本方法&#xff0c;试了无数的方法终于找对了。 1.首先activate对应的虚拟环境&#xff0c;然后输入下面的命令&#xff1a; conda install python3.8 建议加上镜像源 ​conda install python3.8 -i https://pypi.tuna.tsingh…

长虹智能电视使用123

1、开机 在接通电源的情况下&#xff0c;长虹智能电视开机有两种方式。 方式1&#xff1a; 按电视右下角开机按钮 方式2&#xff1a; 按电视遥控器开机按钮 长虹智能电视开机后会进入其操作系统&#xff08;安卓&#xff09;。 屏幕左右双箭头图表&#xff0c;手指点击会…

如何查看Android 包依赖关系

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、查看依赖关系3.1 方式一3.2 方式二…

C语言——判断1~100中的奇数

方式一、 while&#xff0c;if语句 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i1;while(i<100){if(1 i%2)printf("%d ",i);i;}return 0; } 方式二、 while&#xff0c;if语句 #define _CRT_SECURE_NO_WARNINGS 1#include&…

智慧工地综合管理平台-项目整体需求规格说明书

引言 定位与目标 智慧工地是一种现代化的管理方式,目标是通过应用现代科技手段,对施工现场的设备、人员、物资等信息全面掌控,减少工地事故的发生,提高施工质量和安全性,同时也能够降低成本,提高效益,实现建筑施工的数字化、智能化和可持续发展,为城市建设和社会发展…

绿联DX4600 AList部署及挂载阿里云盘

写在前面 ​ 因为云盘总是封禁已经转存的文件&#xff08;珍惜影片&#xff09;&#xff0c;实在受不了了&#xff0c;就像购买个NAS构建私人云存储&#xff0c;正好趁着双11购入了绿联的DX4600&#xff0c;本来想购入群晖或者威联通等专业NAS&#xff0c;因为不想折腾&#x…

算法秘籍-王一博 | 数据结构与算法

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 数据结构和算法是计算机科学的基石&#xff0c;是计算机的灵魂&…

一分钟带你了解易货:来龙去脉,古往今来

原始社会&#xff0c;没有货币&#xff0c;人类没有货币&#xff0c;用捕猎来的兽皮换取需要的野果&#xff0c;用一头羊换几只鸡&#xff0c;等等之类&#xff0c;都属于最早的交换。那个时候&#xff0c;人类没有价值的定义&#xff0c;属于最原始的交换。 直到私有制的形成&…

IP协议相关技术

文章目录 IP协议相关技术仅凭IP无法完成通信DNSARP IP协议相关技术 仅凭IP无法完成通信 人们在上网的时候其实很少直接输入某个具体的IP地址。 在访问Web站点和发送、接收电子邮件时&#xff0c;我们通常会直接输入Web网站的地址或电子邮件地址等那些由应用层提供的地址&…