DirectX 9点精灵未缩放

DirectX 9 point sprites not scaling

本文关键字:缩放 精灵 9点 DirectX      更新时间:2023-10-16

我让点精灵几乎立即工作,但我只关注一件事,它们可能被渲染为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_APOINTSCALE_B时,没有什么真正的变化,对C.POINTSIZE来说也是一样的。当我尝试为POINTSIZE_MAX_MIN指定某些内容时,无论我指定了什么,它都会停止精灵的渲染。我还尝试将POINTSIZEPOINTSCALEENABLE设置为false,但也没有成功。

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

ParticlePointsparticleSpeeds是D3DXVector3数组,我从中得到了我所期望的。我遵循的一本书建议我用XYZ和漫反射定义一个自定义顶点,但老实说,我看不出有什么理由这样做,它只是在一长串声明中添加了更多。

欢迎任何帮助,提前谢谢。

编辑:进一步的调整显示,与任何刻度值高于0.99999997f(至少在0.99999998f之间,我看到效果)相比,我得到了小版本,如果我把它们放在那里或更低,我几乎得到了纹理的大小-尽管这仍然不是很好,因为它可能很大,而且它几乎无法控制。

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

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