构造函数值未在启动时应用

时间:2016-06-12 12:08:19

标签: c++ directx directx-11

我最近制作了体积渲染系统,希望将它们用于粒子效果,同时尝试使用尘埃发射器时,我注意到粒子的定位完全错误。我生成种子随机数,我将其输入每个单独的粒子以设置位置。当我开始正常调试时,粒子只会在两个位置上彼此生成。当应用断点并一次一个地循环一个粒子然后继续时,每个粒子都在其指定的随机位置。除此之外,在测试大粒子池上的问题时,我使用一个hitcount来打破一定数量的循环,并发现当发生这种情况时,它只将它们初始化为一个到上述两个位置。可能导致这种情况的原因是什么?

VolumetricDust::VolumetricDust(string type, Transform* transform, ID3D11Device* pDevice, int width, int height, int depth, bool instanceFlag, int instanceCount)
{

  for (int i = 0; i < POOL_SIZE; i++)
 {
    // PROBLEM LOOP
    particles_[i] = new ParticleVolume("Resources\\nucleon.raw", transform, width, height, depth, instanceFlag, instanceCount);
    particles_[i]->Initialise(pDevice);

    srand((unsigned int)time(NULL));
    int test = (rand() % 100 + 1);
    int test1 = rand() % 30 + 1;
    int test2 = rand() % 50 + 1;

    particles_[i]->SetVelocity(XMFLOAT3(0.0f, (float)test, 0.0f));
    particles_[i]->GetTransform()->SetPosition((float)test, (float)test1, (float)test2);


  }

 posReset = transform;
 _transform = transform;

 mWidth = width;
 mHeight = height;
 mDepth = depth;

 isInstance = instanceFlag;
 instanceNum = instanceCount;

_currentTime = 0.0f;
_spawnTime = 5.0f;
_newTime = 0.1f;
_dustTime = 0.0f;
particleTime = 5.0f;
_type = type;
_pd3dDevice = pDevice;
}

void VolumetricDust::SpawnEmitter()
{

for (int i = 0; i < POOL_SIZE; i++)
{
    if (!particles_[i]->GetParticleOn())
    {

        particles_[i]->SetParticleOn(true);
        break;
    }

}

}

void VolumetricDust::Update(float dt, Camera* cam)
{
_transform->Update();
_currentTime += dt;
_dustTime += dt;


for (int i = 0; i < POOL_SIZE; i++)
{
    SpawnEmitter();

    if (particles_[i]->GetParticleOn())
    {

        //posReset->SetPosition(XMFLOAT3(0.0f, 0.0f, 0.0f));

        particles_[i]->Update(dt, cam, posReset->GetPosition());
    }

    if (_transform)
    {
        _transform->Update();
    }

}



}

void VolumetricDust::Draw(ID3D11DeviceContext * _pImmediateContext, ConstantBuffer3D & cb, ID3D11Buffer* _pConstantBuffer)
{
 for (int i = 0; i < POOL_SIZE; i++)
 {
    if (particles_[i]->GetParticleOn())
    {
        particles_[i]->Draw(_pImmediateContext, cb, _pConstantBuffer);
    }

 }

}

1 个答案:

答案 0 :(得分:4)

您应该只拨打srand一次。

当你在这样的循环中调用它时,每次获得相同时间值的几率非常高。这会重置随机数,对于大多数(如果不是全部)点,您将获得相同的结果。

在调试器中停止会让实时调用time之间发生变化,并且您会获得单独的随机值,因为种子现在会有所不同。