DirectX11引擎:编译错误C2719、C2678

DirectX11 engine: Compile errors C2719, C2678

本文关键字:C2719 C2678 错误 编译 引擎 DirectX11      更新时间:2023-10-16

我目前正在为我的Cpp类做最后一个项目,其中包括使用directX11创建一个2D游戏。我一直在关注网站rastertek.com(directX 11 series 2)上的教程,在大多数情况下,它进展得相当顺利。然而,我今天早上完成的着色器代码部分立即出现了一些错误。

起初,它在我的colorshaderclass.cpp的第44行和第248行给了我错误C2719,我的XMMIX值被传入。在对这个主题进行了一些快速研究后,我将那些被传入的XMMIX值更改为常量引用。然后,我进入colorshaderclass.h文件,根据需要将第37行和第44行的XMMIX值更改为常量引用。

在这样做之后,我不再显示错误C2719。但是,现在我在colorshaderclass.cpp文件的第256、257和258行遇到错误C2678(二进制"=":找不到采用"const DirectX::XMMIX"类型的左侧操作数的运算符)。我也对这个错误做了一些研究,但它似乎非常依赖于情况,我对此没有运气

事实上,我应该说,我想我理解它为什么会抛出错误(一边是常量,另一边是非常量),但我不知道在这一点上该怎么办,因为我必须将部分代码转换为常量引用才能使它们工作。我还应该提到,目前我的编程经验还不到六个月,如果这看起来像是一个明显的修复或其他什么,我很抱歉。如果有人有任何见解或想法,我们将不胜感激。干杯

如果需要,我还可以提供整个解决方案的其他几个部分,尽管它们都没有出现任何错误。

违规代码低于(C2678)

worldMatrix = XMMatrixTranspose(worldMatrix);
    viewMatrix = XMMatrixTranspose(viewMatrix);
    projectionMatrix = XMMatrixTranspose(projectionMatrix);

XMMIX值我改为常量参考:

bool ColorShaderClass::SetShaderParameters(ID3D11DeviceContext* deviceContext, const XMMATRIX& worldMatrix, const XMMATRIX& viewMatrix, const XMMATRIX& projectionMatrix)
bool ColorShaderClass::Render(ID3D11DeviceContext* deviceContext, int indexCount, const XMMATRIX& worldMatrix, const XMMATRIX& viewMatrix, const XMMATRIX& projectionMatrix)

我在头文件中更改了什么

bool Render(ID3D11DeviceContext*Int, int, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);
bool SetShaderParameters(ID3D11DeviceContext*, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);

从您的报告中还不清楚所有变量类型是什么。您的worldMatrix是否声明为XMFLOAT4X4XMVECTORXMMATRIX都有对齐要求,因此不建议将它们直接用作类/结构变量。如果您遵循该建议,则需要使用XMStoreFloat4x4XMLoadFloat4x4XMFLOAT4X4XMMATRIX之间进行转换。

因此,一个典型的用法是:

class MyClass
{
    DirectX::XMFLOAT4X4 m_worldMatrix;
};
// ...
void MyClass::SomeFunction()
{
   XMMATRIX worldMatrix = XMLoadFloat4x4( &m_worldMatrix );
   // do some stuff with worldMatrix as an ``XMMATRIX``
   XMStoreFloat4x4( &m_worldMatrix, worldMatrix );
}

是的,这很冗长,但有意为之。进行SIMD编程时,大部分性能损失是转换为非对齐和/或标量类型。这种模式鼓励高级程序员将值加载到"寄存器代理"类型(XMMATRIXXMVECTOR)中,然后在将它们存储回标量或非对齐类型之前进行大量操作。

如果您喜欢C++运算符重载的便利性,请参阅DirectX工具包中的SimpleMath。它提供了一些"包装"DirectXMath的类,这样使用起来更直观。它确实有一些性能影响,但除非你真的对性能敏感,否则你不会注意到。混合使用SimpleMath和DirectXMath类型也非常容易。上面的例子是:

class MyClass
{
   DirectX::SimpleMath::Matrix m_worldMatrix;
};
// ...
void MyClass::SomeFunction()
{
    XMMATRIX worldMatrix = m_worldMatrix;
    // do some stuff with worldMatrix as an ``XMMATRIX``
    // or just use the methods and operator overloads directly
    // of the ``Matrix`` SimpleMath type
    m_worldMatrix = worldMatrix;
}

至于参数的使用,您当然可以像现在这样使用const-ref,但您可能会发现使用MSDN上描述的各种DirectXMath调用约定类型很有帮助。对于您的示例,它最终会显示为:

bool XM_CALLCONV ColorShaderClass::SetShaderParameters(ID3D11DeviceContext* deviceContext, FXMMATRIX worldMatrix, CXMMATRIX viewMatrix, CXMMATRIX projectionMatrix)

这并不是绝对必要的,但如果您试图利用x86 __fastcall、x86 __vectorcall、x64 __fastcall、x64 __vectorball和ARM之间的各种SIMD友好调用约定,这些类型和XM_CALLCONV宏可以实现这一点。

相关文章: