3

3Dシミュレーションプロジェクトの構築にDirectXMathを使用しています

   void SetConstantBuffer(ID3D11DeviceContext*_device_context, DirectX::XMMATRIX _world, DirectX::XMMATRIX _view, DirectX::XMMATRIX _projection)
   {
       ConstantBuffer const_buffer;
       const_buffer.View = DirectX::XMMatrixTranspose(_world);
       const_buffer.World = DirectX::XMMatrixTranspose(_view);
         const_buffer.Projection = DirectX::XMMatrixTranspose(_projection);
       _device_context->UpdateSubresource(m_const_buffer, 0, NULL, &const_buffer, 0, 0);
   }

おそらくDirectXMath内のSIMDフラグでこの種のコンパイラエラーが発生します。

エラーC2719:'_world':__declspec(align('16'))の正式なパラメーターは整列されません
エラーC2719:'_view':__declspec(align('16'))の正式なパラメーターは整列されません
エラーC2719 :'_projection':__declspec(align('16'))を含む正式なパラメーターは整列されません

DirectX :: XMFLOAT4X4に変換せずに他の方法はありますか?
ちなみに、私はx86マシンを使用しており、Visual Studio2012Expressでコンパイルしています。

4

3 に答える 3

5

値ではなく const 参照によって値を渡します。

void SetConstantBuffer(
    ID3D11DeviceContext*_device_context,
    const DirectX::XMMATRIX &_world,
    const DirectX::XMMATRIX &_view,
    const DirectX::XMMATRIX &_projection)
于 2013-03-06T11:19:00.317 に答える
0

MSDN: DirectXMath ライブラリの内部:

FXMMATRIX および CXMMATRIX エイリアスは、__vectorcall で渡す HVA 引数の利用をサポートするのに役立ちます。

FXMMATRIX エイリアスを使用して、最初の XMMATRIX を引数として関数に渡します。これは、2 つを超える FXMVECTOR 引数、または行列の「右側」に 2 つを超える float、double、または FXMVECTOR 引数がないことを前提としています。その他の考慮事項については、__vectorcall のドキュメントを参照してください。

それ以外の場合は、CXMMATRIX エイリアスを使用してください。

DirectXMath コード

// Fix-up for (1st) XMMATRIX parameter to pass in-register for ARM64 and vector call; by reference otherwise
#if ( defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || _XM_VECTORCALL_ ) && !defined(_XM_NO_INTRINSICS_)
typedef const XMMATRIX FXMMATRIX;
#else
typedef const XMMATRIX& FXMMATRIX;
#endif

// Fix-up for (2nd+) XMMATRIX parameters to pass by reference
typedef const XMMATRIX& CXMMATRIX;

解決

より広い範囲のプロセッサ アーキテクチャをサポートする場合はXM_CALLCONV、ハード コーディングではなくマクロを使用して呼び出し規約を指定することをお勧めし__vectorcallます。

void XM_CALLCONV SetConstantBuffer(
    FXMMATRIX _world, 
    CXMMATRIX _view, 
    CXMMATRIX _projection, 
    ID3D11DeviceContext *_device_context) {
}
于 2017-12-10T09:25:04.410 に答える