我使用D3DXSprite绘制纹理 我想转换它们(旋转,缩放等等),所以我使用SetTransfrom方法 我应该存储旧的转换 - >设置一个新的 - >画 - >设置旧的? 我有一个sprite类,它负责Draw和Update方法。 我的意思是这样的:
D3DXMatrix oldMatrix;
sprite->GetTransfrom(&oldMatrix);
D3DXMatrix newMatrix;
D3DXMatrixScaling(&newMatrix, 2.0f, 2.0f, 0.0f);
sprite->SetTransform(&newMatrix);
sprite->Draw(...);
sprite->SetTransform(&oldMatrix);
好/坏?
答案 0 :(得分:1)
检索oldMatrix
并将其用于计算newMatrix
(精度问题)会有什么不好。最好在每次抽奖时重新计算一个新的矩阵。
您可能希望为每个精灵存储的是位置,旋转和比例因子。
答案 1 :(得分:1)
TBH绘制2个tris(我假设那是你的精灵所做的)改变变换和绘图是非常低效的。
将4个顶点手动转换为1个大动态顶点缓冲区并将所有内容渲染为oner,这样做要好得多。应用于精灵的纹理也是如此。将它们保存在一个大的纹理中将为您节省许多状态更改,并允许您在整体上更快地完成渲染。
编辑:进行多次DrawPrimitive / DrawIndexedPrimitive调用非常慢。对于您设置的每个矩阵,您需要进行单独的绘制调用。避免这种情况的方法是自己将矩阵应用于4个顶点中的每个顶点,然后将它们复制到已经变换的顶点缓冲区中。这意味着您可以使用标识世界矩阵集进行一次绘图调用。
事后看来,很可能ID3DXSprite会将此抽象远离您,因为您无法设置角落。如果它没有从你那里抽象出来,表现真的会很糟糕。
然而,它不太可能抽象出纹理问题。因此,最好将精灵的所有帧存储在一个纹理中(并且可能在一个纹理中存储多个精灵的所有帧)。所以在这种情况下,你最好不要传递一个IDirect3DTexture并将pSrcRect设置为你所在帧的子矩形,而不是使用单独的纹理。您使用的纹理越少,性能就越好。