博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用DirectX实现粒子系统(二)
阅读量:6264 次
发布时间:2019-06-22

本文共 2526 字,大约阅读时间需要 8 分钟。

引言

上一篇讲了点精灵的理论部分,这篇看一下如何在DX程序中使用点精灵。

定义顶点格式

为了简化程序,我们使用LT(Lit and transformed format)顶点格式,也就是不需要额外的光照和变换。

//
 点精灵对应的顶点
struct
 POINTVERTEX
{
     
float
 x, y, z ; 
//
 位置
     D3DCOLOR color; 
//
 颜色
};
//
 点的格式是经过光照和变换的,无需设置光照和变换矩阵
#define
 D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

创建顶点及顶点缓冲区

这里首先创建九个顶点,每行三个,三行的颜色分别是红绿蓝。然后创建一个顶点缓冲区,最后将顶点拷贝的顶点缓冲区中。

HRESULT CreateVertex(){    POINTVERTEX points[] =    {        {
-5.0f, 5.0f, 0.0f, 0xffff0000}, { 0.0f, 5.0f, 0.0f, 0xffff0000}, { 5.0f, 5.0f, 0.0f, 0xffff0000}, {
-5.0f, 0.0f, 0.0f, 0xff00ff00}, { 0.0f, 0.0f, 0.0f, 0xff00ff00}, { 5.0f, 0.0f, 0.0f, 0xff00ff00}, {
-5.0f, -5.0f, 0.0f, 0xff0000ff}, { 0.0f, -5.0f, 0.0f, 0xff0000ff}, { 5.0f, -5.0f, 0.0f, 0xff0000ff} } ; // 创建 Vertex buffer if (FAILED(g_pd3dDevice->CreateVertexBuffer( NUM_VERTEX *sizeof(POINTVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS, D3DFVF_POINTVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL))) { return E_FAIL ; } // 拷贝顶点到Vertex buffer中 VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(points), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, points, sizeof(points) ); g_pVB->Unlock();}

渲染

渲染主要分三步,首先设置一系列渲染状态,比如开启Blend,因为我们用到了纹理,所以要使用纹理混合功能,最重要的两个渲染状态分别是D3DRS_POINTSPRITEENABLE和D3DRS_POINTSCALEENABLE,前者启用点精灵,后者使点精灵可缩放。然后是渲染部分,渲染的类型是POINTLIST。最后部分是恢复前面设置的某些状态,比如禁用Blend。

if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ){       // 设置渲染状态    g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); // 开启Blend    g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );    g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );    g_pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE) ;    g_pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE) ;    g_pd3dDevice->SetRenderState( D3DRS_POINTSIZE, FtoDW(0.2f) ); // 点大小    // 设置纹理,纹理之前已经创建好    g_pd3dDevice->SetTexture(0, g_pTexture) ;    // 绘制points    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(POINTVERTEX));    g_pd3dDevice->SetFVF(D3DFVF_POINTVERTEX) ;    g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, NUM_VERTEX) ;       // 禁用Blend    g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );    g_pd3dDevice->EndScene();}

效果图

为什么说点精灵是高效的呢,拿上面的图来说,我只使用了9个顶点,每个顶点配一个纹理图片。如果不使用点精灵儿直接贴图,那么至少需要4*9=36个顶点。可见点精灵是十分节省内存资源的。

Happy Coding!!!

== THE END ==

本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2012/06/27/2052351.html,如需转载请自行联系原作者

你可能感兴趣的文章
40个js小技巧:屏蔽鼠标右键、取消选取、防止复制、粘贴、转换地址栏图标
查看>>
mac apache的使用
查看>>
go标准库的学习-hash
查看>>
log4j容器初始化探究
查看>>
Linux通配符与特殊符号知识大全
查看>>
[BZOJ5105]【[Code+#1]晨跑】
查看>>
bootstrap到底是用来做什么的(概念)
查看>>
高并发服务端分布式系统设计概要
查看>>
sqlite3.datebase.serialize(function(){})的问题
查看>>
Xml通用操作类
查看>>
网站访问数据统计工具
查看>>
11面向对象封装案例
查看>>
动态加载js小笔
查看>>
C#_IComparer实例 - 实现ID或者yearOfscv排序
查看>>
2016 hosts
查看>>
TypeKit ,use online fonts
查看>>
原生Ajax
查看>>
文件上传及下载
查看>>
七、jquery对象的学习,有难度
查看>>
Ajax_数据格式_HTML
查看>>