2015-12-05 55 views
0

我目前正在研究我的Cpp類的最終項目,其中涉及使用directX11創建2D遊戲。我一直在關注網站rastertek.com(directX 11系列2)的教程,而且大多數情況下它一直都很順利。然而,今天早上我完成的着色器上的部分代碼馬上出現了一些錯誤。DirectX11引擎:編譯錯誤C2719,C2678

起初它給我錯誤C2719在我的colorshaderclass.cpp在行44和248與我的XMMATRIX值被傳入。經過對該主題的一些快速研究後,我更改了那些XMMATRIX值傳遞到常量引用。然後我進入我的colorshaderclass.h文件,並根據需要將第37和44行上的XMMATRIX值更改爲常量引用。

這樣做後,我不再有錯誤C2719出現。但是現在我在我的colorshaderclass.cpp文件的第256,257和258行出現錯誤C2678(二進制'=':沒有發現操作符,它帶有'const DirectX :: XMMATRIX'類型的左側操作數)。我也對這個錯誤做了一些研究,但它似乎非常依賴於情況,而且我沒有運氣。

其實,我應該說我想我明白爲什麼它會拋出錯誤(一方面是const,另一方面是非常量),但是我在這個時候不得不做的是,將代碼的一部分轉換爲常量引用來讓它們工作。我還應該提到,在這一點上,我的編程經驗還不到六個月,所以,如果這看起來像是一個明顯的修復或其他任何問題,那麼很抱歉。如果任何人有任何見解或想法,將不勝感激。 乾杯!

如果需要,還可以提供整個解決方案的其他幾個部分,但它們都不會引發任何錯誤。

有問題的代碼如下(C2678)

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

,我改爲經常提到的XMMATRIX值:

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&); 

回答

0

從報告中不清楚所有變量類型是什麼。你的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 Tool Kit中查看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的裁判就像你在做什麼,但你可能會發現它有助於使用上MSDN描述調用約定類型的各種DirectXMath。對於你的榜樣,這將最終爲:

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

這不是絕對必要的,但如果你想利用跨86 __fastcall,86 __vectorcall,64 __fastcall,64多種SIMD友好調用約定__vectorcall和ARM這些類型和XM_CALLCONV宏可以實現這一點。