gpt4 book ai didi

c++ - DirectX 9 点 Sprite 不缩放

转载 作者:行者123 更新时间:2023-11-28 06:11:36 24 4
gpt4 key购买 nike

我几乎立即得到了点 Sprite ,但我只坚持一件事,它们被渲染为可能是 2x2 像素的 Sprite ,这并不是很容易看到,尤其是在有其他运动的情况下。现在,我已经尝试调整所有变量,下面是可能效果最好的代码:

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 分配某些内容时,无论我分配什么,它总是会停止 Sprite 的渲染。我还尝试将 POINTSIZEPOINTSCALEENABLE 设置为 false,但也不走运。

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

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

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

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

最佳答案

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

One more problem that I've seen is you float to dword cast. The official documentation suggests the following conversion *((DWORD*)&Variable (doc) to be put into SetRenderState. I'm not very familiar with C++, but I would assume that this makes a difference, because your cast sets a real dword, but the API expects a float in the dwords memory space.

关于c++ - DirectX 9 点 Sprite 不缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com