游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1179|回复: 0

Directx3D粒子实现的一些问题

[复制链接]

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2018-10-17 01:45:36 | 显示全部楼层 |阅读模式
最近在看红龙书的雪球粒子样例,实现方式是建立一个2048的顶点缓存,每个片断可容纳512个粒子。我看它直接创建了6000个雪球粒子,然后逐个片断填充到顶点缓存里。
  1. Particle* v = 0;

  2.                 _vb->Lock(
  3.                         _vbOffset    * sizeof( Particle ),
  4.                         _vbBatchSize * sizeof( Particle ),
  5.                         (void**)&v,
  6.                         _vbOffset ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD);

  7.                 DWORD numParticlesInBatch = 0;

  8.                 std::list<Attribute>::iterator i;
  9.                 for(i = _particles.begin(); i != _particles.end(); i++)
  10.                 {
  11.                         if( i->_isAlive )
  12.                         {
  13.                                 // 更新例子坐标和颜色
  14.                                 v->_position = i->_position;
  15.                                 v->_color    = (D3DCOLOR)i->_color;
  16.                                 v++;

  17.                                 numParticlesInBatch++; //增加片断计数

  18.                                 // 当一个批次渲染完成时
  19.                                 if(numParticlesInBatch == _vbBatchSize)
  20.                                 {
  21.                                         _vb->Unlock();

  22.                                         _device->DrawPrimitive(
  23.                                                 D3DPT_POINTLIST,
  24.                                                 _vbOffset,
  25.                                                 _vbBatchSize);

  26.                                         // 增加偏移,使其指向下一个片断
  27.                                         _vbOffset += _vbBatchSize;

  28.                                         if(_vbOffset >= _vbSize)
  29.                                                 _vbOffset = 0;      

  30.                                         _vb->Lock(
  31.                                                 _vbOffset    * sizeof( Particle ),
  32.                                                 _vbBatchSize * sizeof( Particle ),
  33.                                                 (void**)&v,
  34.                                                 _vbOffset ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD);

  35.                                         numParticlesInBatch = 0; // 重新对新的片断进行计数
  36.                                 }        
  37.                         }
  38.                 }

  39.                 _vb->Unlock();
复制代码

然后我的问题就来了,顶点缓存不是只能容纳2048个粒子吗,难道不是只会在一屏里显示2048个粒子,6000个粒子是怎么做到的?

当我假设只能容纳2048个粒子时,如果先渲染前2048个粒子,当我渲染下一组2048时,由于跟前面2048个粒子位置或者颜色之类的参数不一样,应该会出现画面一闪一闪才对。所以推翻了自己的假设。又陷入另一个问题,难道是因为渲染速度太快,所以残留在我们视野里,所以看起来很多?如果不是,那怎么解释即能同时存在6000个粒子,还能改他们位置和颜色状态的。

还有另一个问题是,为什么_vbOffset为0时使用D3DLOCK_DISCARD,而不为0用D3DLOCK_NOOVERWRITE。难道是因为用了D3DLOCK_DISCARD时,它跟Lock方法的第一个参数和第二个参数无关,不是替换的其中一段大小为_vbBatchSize * sizeof( Particle )的内存,而是整段顶点缓存的内存都返回一个新的,然后才让我能够用D3DLOCK_NOOVERWRITE继续追加到下一个片断?假如它返回的是一整段新的顶点缓存,那当我Unlock是不是会造成我只填充了顶点缓存的前一部分,后面的还没填充?
因为我是刚接触DX相关的,所以有些东西理解的不是很明白,希望各位能指点指点,先谢谢各位了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-4-17 00:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表