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 に答える