2015-07-01 40 views
0

我的点精灵几乎马上就能工作,但我只是停留在一件事上,它们被渲染为可能是2x2像素的精灵,这并不是很容易看到,特别是如果还有其他运动。现在,我已经试过调整所有的变量,这里的大概效果最好代码:DirectX 9点精灵无法缩放

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,发现没有答案的similar questionAnother source只建议设置最大和最小变量,正如我所说,这几乎使我的粒子消失。

ParticlePointsparticleSpeeds是D3DXVector3数组,我得到了我期望的结果。我遵循的一本书建议我使用XYZ定义一个自定义顶点并进行扩散,但我认为没有理由说实话,它只是在一长串声明中增加了很多。

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

编辑:进一步的调整显示出比当任何比例值高于0.99999997f,我得到的微小的版本,如果我把它们放在那里或较低的I(至少和0.99999998f我看到效果之间)几乎可以获得纹理的大小 - 虽然这还不是很好,因为它可能很大,而且几乎没有可控的任务。

+0

你已经设定大小的矢量的流源,但实际上你vertexbuffer锁定用'particleCount *的sizeof(PARTICLE_VERTEX)',有点不一致,但不应该的问题就在这里。您是如何创建顶点缓冲区的,具有FVF或动态大小的?此外,您还没有为渲染设置FVF或顶点声明,还是您在别处设置了它? – Gnietschow

+0

我见过的另外一个问题是你漂浮在dword cast上。官方文档建议将下面的转换'*((DWORD *)&Variable'(https://msdn.microsoft.com/en-us/library/windows/desktop/bb172599%28v=vs.85%29.aspx)放到'SetRenderState'中,我对C++不是很熟悉,但是我认为这会有所作为,因为你的演员设置了一个真正的dword,但是API期望在dword存储空间中有一个浮点数 – Gnietschow

+0

@Gnietschow,我在其他地方设置了FVF,缓冲区是固定的大小和大于将要使用的大小,我认为我通过浮动的方式是正确的,这是一开始就存在的问题,事实证明我所遵循的书是宏在其他地方定义,我没有意识到它的重要性,谢谢。您可以发布它作为答案,以便我可以接受它并关闭此线程 – user3079666

回答

1

很高兴帮助:)作为回答我的评论:我所看到的是你浮动为DWORD投

还有一个问题。官方文档建议将以下转换*((DWORD*)&Variabledoc)放入SetRenderState中。我对C++并不是很熟悉,但我会认为这会有所作为,因为您的演员设置了一个真正的双字,但是API期望在双字存储空间中有一个浮点。