c++ - DirectX 9 点 Sprite 不缩放

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

我几乎立即得到了点 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/

相关文章:

c++ - 如何解决指针别名问题?

c++ - 是否可以在分配期间在 C++ 中给出一个类的定义,这在 Java 中是允许的

c++ - OpenCV 估计 Affine3D 共面点的断裂

安卓自定义EditText

c++ - 调整窗口大小后交换渲染缓冲区会导致问题

opengl - 现代游戏和其他 3D 应用程序的透明度

c++ - 从理论上使用回溯递归解决数独难题

swift - 处理 Swift 时出现奇怪的运行时 SceneKit 错误(C3DRendererContextBindMeshElement)

c++ - 两点之间的曲线怎么画? OpenGL

c++ - 16字节对齐问题