DirectX11引擎:编译错误C2719、C2678
DirectX11 engine: Compile errors C2719, C2678
我目前正在为我的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
是否声明为XMFLOAT4X4
?XMVECTOR
和XMMATRIX
都有对齐要求,因此不建议将它们直接用作类/结构变量。如果您遵循该建议,则需要使用XMStoreFloat4x4
和XMLoadFloat4x4
在XMFLOAT4X4
和XMMATRIX
之间进行转换。
因此,一个典型的用法是:
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编程时,大部分性能损失是转换为非对齐和/或标量类型。这种模式鼓励高级程序员将值加载到"寄存器代理"类型(XMMATRIX
、XMVECTOR
)中,然后在将它们存储回标量或非对齐类型之前进行大量操作。
如果您喜欢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
宏可以实现这一点。
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 如何解决错误 C2719 在 Visual Studio 2010 C++ 中不存在代码行时
- 错误 C2678:二进制"+":未找到采用类型 'volatile A' 的左侧操作数的运算符(或者没有可接受的转换)
- 为什么我得到"C2678 二进制'+':没有找到采用类型为"const 的左操作数......"的运算符。"在这种情况下?
- 在定义C2679和C2678错误代码的地方未找到二进制操作员
- 错误 c2678:二进制'=='
- 错误C2678 C A*路障
- 错误 C2678:二进制'==':找不到采用 'std::pair<const _Kty,_Ty>' 型左操作数的运算符
- (错误 C2678)错误:没有运算符"<<"与这些操作数匹配
- c++找不到带错误c2678的运算符
- 错误 C2678:二进制'>':找不到采用左侧操作数的运算符
- 错误 C2678:二进制">>":找不到采用类型为"std::basic_istream<_Elem,_Traits>"的左操作数的运算符
- 错误 C2678:二进制">>":找不到采用类型为"std::stringstream "的左操作数的运算符
- 派生类函数参数作为基类引用导致C2678
- 错误 C2678:'=='二进制:未找到采用类型 'CSchemaString' 的左操作数的运算符(或者没有可接受的转换)
- 使用模板时出现错误C2678
- 比较未引用的映射迭代器(std::pairs):C2678
- 迁移到 VS2013 比较运算符 错误 C2678:二进制"=="无运算符
- 从自定义数据类型列表中删除时出现 C2678 错误
- DirectX11引擎:编译错误C2719、C2678