0

我让点精灵几乎立即工作,但我只坚持一件事,它们可能被渲染为 2x2 像素精灵,这不是很容易看到,特别是如果有其他运动。现在,我尝试调整所有变量,这可能是最有效的代码:

void renderParticles()
{
    for(int i = 0; i < particleCount; i ++)
    {
        particlePoints[i] += particleSpeeds[i];
    }

void* data;
pParticleBuffer->Lock(0, particleCount*sizeof(PARTICLE_VERTEX), &data, NULL);
memcpy(data, particlePoints, sizeof(particlePoints));
pParticleBuffer->Unlock();

pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSIZE, (DWORD)1.0f);
//pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MAX, (DWORD)9999.0f);
//pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_A, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_B, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_C, (DWORD)1.0f);

pd3dDevice->SetStreamSource(0, pParticleBuffer, 0, sizeof(D3DXVECTOR3));
pd3dDevice->DrawPrimitive(D3DPT_POINTLIST, 0, particleCount);

pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE);

}

好的,所以当我更改POINTSCALE_Aand时POINTSCALE_B,并没有什么真正的变化,对于 C 来说也是如此。POINTSIZE也没有什么区别。当我尝试将某些东西分配给POINTSIZE_MAXand_MIN时,无论我分配什么,它总是会停止精灵的渲染。我也尝试将设置POINTSIZE设置POINTSCALEENABLE为false,那里也没有运气。

这看起来好像没有多少人环顾四周找到答案。MSDN上有对该机制的解释,是的,我确实检查了 stackoverflow 并发现了一个类似的问题,但没有答案。另一个消息来源只建议设置 max 和 min 变量,正如我所说,这几乎使我的粒子消失了。

ParticlePoints并且particleSpeeds是 D3DXVector3 数组,我得到了我对它们的期望。我遵循的一本书建议我用 XYZ 和漫反射定义一个自定义顶点,但老实说,我认为没有理由这样做,它只是为一长串声明添加了更多内容。

欢迎任何帮助,在此先感谢。

编辑:当任何比例值高于 0.99999997f 时(至少在 0.99999998f 之间,我看到了效果),显示了进一步的调整,我得到了微小的版本,如果我把它们放在那里或更低,我几乎得到了纹理——虽然它仍然不是那么好,因为它可能很大,而且它几乎无法完成可控的任务。

4

1 回答 1

1

很高兴帮助:) 我的评论作为答案:

我看到的另一个问题是你浮动到 dword cast。官方文档建议将以下转换*((DWORD*)&Variabledoc)放入 SetRenderState。我对 C++ 不是很熟悉,但我认为这会有所不同,因为您的演员设置了一个真正的 dword,但 API 期望在 dwords 内存空间中有一个浮点数。

于 2015-07-03T13:24:24.720 回答