3

使用作为directX一部分的D3DX库,在这种情况下特别是directx9,我想知道使用相同的矩阵(或向量等)进行输入和输出是否安全

D3DXMATRIX mat;
D3DXMatrixInverse(&mat, NULL, &mat);

我一直避免这样做,假设当数组的一部分在计算结果时被部分覆盖时会导致坏事发生,但我看到很多代码都是这样做的。

一个简短的测试表明它似乎工作正常,所以我假设 D3DX 函数在必要的地方获取输入数据的副本,或者其他一些方法来确保这工作正常,但我在任何地方都找不到它的文档所以我不愿意依赖它工作。

有没有关于使用这样的功能的官方声明?

4

2 回答 2

3

是的。来自msdn

每个函数都可以采用与传递的 [in] 和返回的 [out] 参数相同的对象

于 2010-03-24T16:26:32.650 回答
1

我很确定答案是肯定的。我找不到任何可以肯定地说的地方......

编辑:浏览 D3DX9Math.inl 看起来已经小心翼翼地确保你能做到。例如,如果我们查看 D3DXVec3Cross 的代码:

D3DXINLINE D3DXVECTOR3* D3DXVec3Cross
    ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
{
    D3DXVECTOR3 v;

#ifdef D3DX_DEBUG
    if(!pOut || !pV1 || !pV2)
        return NULL;
#endif

    v.x = pV1->y * pV2->z - pV1->z * pV2->y;
    v.y = pV1->z * pV2->x - pV1->x * pV2->z;
    v.z = pV1->x * pV2->y - pV1->y * pV2->x;

    *pOut = v;
    return pOut;
}

您可以看到它将叉积执行为临时的,然后在最后一步中,将其复制到返回中。如果可以肯定地在某处说明这一点,那就太好了。

于 2010-03-24T14:49:24.460 回答