基于DIRECTX的3D粒子系统构建(2)

 

三、在DIRECTX9.0环境下粒子系统的实现

 

       这一节,笔者将会介绍在DIRECTX9.0环境下如何实现一个简单的粒子系统,并着重对Point Sprites粒子类型作详细说明。

1Point Sprites粒子结构

 

       首先来看一个Point Sprites粒子是如何定义的:

       //一个Point Sprites粒子的顶点结构

       typedef struct

{

       MyVector position; //位置

       D3DCOLOR color; //颜色

}POINTSPRITEVERTEX, *LPPOINTSPRITEVERTEX;

 

 

//一个Point Sprites的结构

typedef struct

 

{

 

    char *TexName; //贴图名称

 

    float size;     //大小

 

    POINTSPRITEVERTEX pointspritevertex; //顶点数据

 

    LPDIRECT3DVERTEXBUFFER9 lpVertexBuffer; //顶点填充BUFFER

 

    MY_MATRIX   TM;         //粒子的世界变换矩阵

 

}POINTSPRITE, *LPPOINTSPRITE;

 

 

 

 

 

2Point Sprites粒子的渲染状态

 

 

 

pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, true);

 

D3DRS_POINTSPRITEENABLE这个渲染状态,当设置为true时,贴图会完全贴上Point Sprites粒子;如果设置为false,那么,当粒子的顶点结构中有UV坐标时贴图才有效,并且根据不同粒子的UV坐标贴到不同的位置。

 

 

pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, true);

 

D3DRS_POINTSCALEENABLE这个渲染状态,当设定为true时,粒子的大小会受摄象机位置的影响,也就是有正确的透视关系,摄象机离这个粒子越远,粒子越小;如果设置为false,那么粒子将不受摄象机位置的影响,如果这时你设定粒子大小为3,那么这个粒子将始终占据3*3象素大小的屏幕面积。

 

 

pd3dDevice->SetRenderState(D3DRS_POINTSIZE, FtoDw(fScale));

 

D3DRS_POINTSIZE设定粒子的大小(视D3DRS_POINTSCALEENABLE设置的不同,有可能是屏幕大小也有可能是摄象机空间大小)。这个大小是从POINTSPRITE的SIZE变量获得。需要注意的是必须把变量转换为DWORD。

 

 

 

pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, FtoDw(0.0f));

 

D3DRS_POINTSIZE_MIN设定粒子的最小大小,这里设为0,并同样转换为DWORD传入。

 

 

pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, FtoDw(10.0f));

 

D3DRS_POINTSIZE_MIN设定粒子的最大大小,这里设为10,并转换为DWORD传入。

 

 

D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, D3DRS_POINTSCALE_C

 

这三个参数定义当摄象机移动时粒子的大小该如何变化。Direct3D采用以下公式计算粒子的最终显示大小:

 

 

其中:ViewportHeight是视口的高度,SIZE是D3DRS_POINTSIZE设定的大小,ABCD3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, D3DRS_POINTSCALE_C这三个参数设定的大小,D是粒子离摄象机的距离。

 

这个大小的计算是曾经困扰笔者的一个难点,如果要详细了解这样设置的意义…….问微软的人去!

 

 

不过,对于简单的应用没那么麻烦,按下面的设置你能得到正确的效果:

// control the size of the particle relative to distance

pd3dDevice->SetRenderState(D3DRS_POINTSCALE_A, FtoDw(0.0f));

pd3dDevice->SetRenderState(D3DRS_POINTSCALE_B, FtoDw(0.0f));

pd3dDevice->SetRenderState(D3DRS_POINTSCALE_C, FtoDw(1.0f));

 

 

上面我们介绍了基本Point Sprites粒子的结构和渲染过程(部分翻译自《Introduction.to.3D.Game.Programming.with.DirectX.9.0》一书),可以说我们已经有了一些威力巨大的子弹,下面我们看看枪是怎么制作的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《DirectX 3D HLSL 高级实例精讲》是一本关于图形编程技术的书籍,主要讲解了DirectX 3D的高级编程以及HLSL着色语言的使用。 这本书首先介绍了DirectX 3D的基本概念和原理,包括渲染管线、顶点和像素着色器以及纹理等。然后详细介绍了HLSL着色语言,包括语法、变量类型、常量缓冲区和输入输出布局等。通过深入理解HLSL,读者可以编写高效的着色器代码,实现更加逼真和优化的图形效果。 除了基础知识,该书还提供了一些高级实例,涵盖了可见性及遮挡剔除、阴影技术、光照模型、反射折射效果、法线贴图、粒子系统和后期处理等。每一个实例都详细介绍了实现思路和具体的代码实现,读者可以通过跟随实例学习如何使用DirectX 3D和HLSL来实现各种复杂的图形效果。 这本书适合有一定图形编程基础的读者,特别是对DirectX 3D和HLSL感兴趣的开发者。通过学习本书,读者可以深入了解DirectX 3D和HLSL的原理和应用,掌握高级图形编程技术,提升自己在游戏开发、虚拟现实、计算机图形学等领域的能力。 总之,《DirectX 3D HLSL 高级实例精讲》是一本介绍DirectX 3D和HLSL高级编程技术的实用指南,适合有一定图形编程基础的读者学习和参考。它详细讲解了基础原理和实例实现,读者可以通过学习本书提升自己在图形编程领域的能力。 ### 回答2: "DirectX 3D HLSL高级实例精讲" 是一本介绍DirectX 3D和HLSL编程的高级实例教材。该PDF文件详细讲解了如何使用DirectX 3D和HLSL编写高效的图形渲染程序。 该教材涵盖了多个实例,从基本的渲染技术到更高级的图形效果。它从介绍DirectX 3D和HLSL的基础知识开始,然后深入探讨了渲染管线的不同阶段以及如何利用HLSL语言编写高级着色器来实现各种图形效果。 该PDF还提供了大量的代码实例和详细的解释,帮助读者理解和实践所学内容。它包括了如何创建3D对象、设置材质和光照效果、实现纹理映射、使用几何着色器和像素着色器等内容。同时,它还介绍了一些高级技术,如阴影算法、法线贴图、环境光遮蔽等,使读者能够进一步提升图形渲染的质量和效果。 通过学习这本教材,读者可以深入了解DirectX 3D和HLSL的基本原理和技术,掌握如何使用它们来实现各种复杂的图形效果。无论是想要进一步学习图形渲染相关知识的专业人士,还是对图形编程感兴趣的爱好者,该教材都是一本值得阅读的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值