[C++] generische Inputlayout-Erstellung für verschiedene Vertex-Typen in DX11
Verfasst: 10.03.2024, 12:54
Ich möchte die Definition eines InputLayouts in DX11 etwas anpassen. Meine Idee besteht darin, eine Klasse zu erstellen, die wie folgt definiert ist:
Wie man erkennen kann, beabsichtige ich, die Möglichkeit zu bieten, verschiedene Vertex-Typen zu erstellen. Hier sind zwei Beispiele:
Ich kann das dann wie folgt anwenden:
Bis hierhin läuft alles gut. Jetzt stößt jedoch ein Problem auf. In dieser Klasse gibt es eine Funktion namens CreateInputLayout, die wie folgt aussieht:
Einige von Euch sehen vielleicht sofort mein Problem. Beim ersten Vertex funktioniert das gut, aber beim zweiten wirft der Compiler einen Fehler, weil er die Elemente 'normal' und 'texCoord' im zweiten struct VertexPosCol nicht finden kann.
Von der Idee das so wie oben beschrieben umzusetzen bin ich jetzt weg weil ich keine Lösung finden konnte, aber vielleicht hat jemand von Euch eine Idee um das flexibel zu gestallten?
Danke und VG Gombolo
Code: Alles auswählen
template<typename VertexType>
class InputLayoutCreator
Code: Alles auswählen
struct Vertex {
DirectX::XMFLOAT3 position;
DirectX::XMFLOAT4 color;
DirectX::XMFLOAT3 normal;
DirectX::XMFLOAT2 texCoord;
};
struct VertexPosColor {
DirectX::XMFLOAT3 position;
DirectX::XMFLOAT4 color;
};
Code: Alles auswählen
InputLayoutCreator<Vertex> inputLayoutCreator(Engine::engine->Device.GetDevice());
InputLayoutCreator<VertexPosCol> inputLayoutCreatorPosCol(Engine::engine->Device.GetDevice());
Code: Alles auswählen
template<typename VertexType>
ID3D11InputLayout* CreateInputLayout(DWORD flags, const void* shaderBytecode, size_t bytecodeSize) {
std::vector<D3D11_INPUT_ELEMENT_DESC> layoutElements;
if (flags & D3DFVF_POSITION) {
layoutElements.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 });
}
if (flags & D3DFVF_COLOR) {
layoutElements.push_back({ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(VertexType, color), D3D11_INPUT_PER_VERTEX_DATA, 0 });
}
if (flags & D3DFVF_NORMAL) {
layoutElements.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(VertexType, normal), D3D11_INPUT_PER_VERTEX_DATA, 0 });
}
if (flags & D3DFVF_TEX1) {
layoutElements.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(VertexType, texCoord), D3D11_INPUT_PER_VERTEX_DATA, 0 });
}
ID3D11InputLayout* inputLayout = nullptr;
HRESULT hr = m_Device->CreateInputLayout(layoutElements.data(), layoutElements.size(), shaderBytecode, bytecodeSize, &inputLayout);
if (FAILED(hr)) {
Debug::Log("Fehler in Datei InputLayout.h");
}
return inputLayout;
}
Von der Idee das so wie oben beschrieben umzusetzen bin ich jetzt weg weil ich keine Lösung finden konnte, aber vielleicht hat jemand von Euch eine Idee um das flexibel zu gestallten?
Danke und VG Gombolo