DirectX 9点精灵没有缩放

时间:2015-07-01 15:55:30

标签: c++ graphics directx directx-9 point-sprites

我得到的点精灵几乎立即工作,但我只是坚持一件事,它们被渲染成可能是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时,无论我分配什么内容,它总是会停止渲染精灵。我也尝试将POINTSIZE设置为POINTSCALEENABLE设置为false,也没有运气。

这看起来似乎没有多少人环顾四周找到答案。在MSDN上存在对该机制的解释,而是,是的,我确实检查了stackoverflow并找到了没有答案的similar questionAnother source只建议设置最大和最小变量,正如我所说,这几乎使我的粒子消失了。

ParticlePointsparticleSpeeds是D3DXVector3数组,我得到了他们对它们的期望。我遵循的一本书建议我使用XYZ和漫反射来定义一个自定义顶点,但我认为这没有理由说实话,它只是在一长串声明中添加了更多。

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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