我让点精灵几乎立即工作,但我只坚持一件事,它们可能被渲染为 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_A
and时POINTSCALE_B
,并没有什么真正的变化,对于 C 来说也是如此。POINTSIZE
也没有什么区别。当我尝试将某些东西分配给POINTSIZE_MAX
and_MIN
时,无论我分配什么,它总是会停止精灵的渲染。我也尝试将设置POINTSIZE
设置POINTSCALEENABLE
为false,那里也没有运气。
这看起来好像没有多少人环顾四周找到答案。MSDN上有对该机制的解释,是的,我确实检查了 stackoverflow 并发现了一个类似的问题,但没有答案。另一个消息来源只建议设置 max 和 min 变量,正如我所说,这几乎使我的粒子消失了。
ParticlePoints
并且particleSpeeds
是 D3DXVector3 数组,我得到了我对它们的期望。我遵循的一本书建议我用 XYZ 和漫反射定义一个自定义顶点,但老实说,我认为没有理由这样做,它只是为一长串声明添加了更多内容。
欢迎任何帮助,在此先感谢。
编辑:当任何比例值高于 0.99999997f 时(至少在 0.99999998f 之间,我看到了效果),显示了进一步的调整,我得到了微小的版本,如果我把它们放在那里或更低,我几乎得到了纹理——虽然它仍然不是那么好,因为它可能很大,而且它几乎无法完成可控的任务。