2017-12-28 28 views
0

I die folgende constexpr GLenum Array verwende darzustellen GL_COLOR_ATTACHMENTx (wobei X eine ganze Zahl ohne Vorzeichen zwischen 0 und 7):Speichern OpenGL Farb Anhänge in constexpr GLenum Array

constexpr std::array<GLenum, 8> opengl_color_attachment{GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT7}; 

Dies funktioniert nur für die ersten acht verfügbare Farbanhänge (die laut OpenGL-Spezifikation das Mindestmaß darstellen). Es besteht jedoch die Möglichkeit, dass weitere Anhänge hinzugefügt werden. Da das Makro GL_MAX_COLOR_ATTACHMENTS die Anzahl der verfügbaren Attachments darstellt, wollte ich dieses constexpr-Array so bearbeiten, dass ALLE verfügbaren Attachments zum Limit statt des Mindestwerts von 8 enthalten sind.

Ich habe das folgende Makro erstellt, um dieses Problem zu lösen ich:

#define OPENGL_COLOR_ATTACHMENT(x) GL_COLOR_ATTACHMENT##x 

Obwohl ich in einer constexpr Funktion diese verwenden wollte das Array in der Kompilierung-Zeit zu schaffen, es ist fehlgeschlagen, da Präprozessormakros offensichtlich vor der Kompilierung verarbeitet werden. Obwohl der OpenGL-Standard diese GL_TEXTURE1 == GL_TEXTURE0 + 1 garantiert, konnte ich eine solche Referenz für dieses Makro nicht finden, so dass ich unsicher bin, ob sie in diesem Fall sequenziell sind.

Gibt es eine Möglichkeit für mich, das consExpr-Array vollständig von GL_COLOR_ATTACHMENT0 nach GL_COLOR_ATTACHMENTx zu erstellen, wobei x = GL_MAX_COLOR_ATTACHMENTS, mit oder ohne Präprozessor-Makros?

+0

Sind die 'GL_COLOR_ATTACHMENTx' Werte sequenziell? –

+0

@VittorioRomeo Siehe meine letzte Bearbeitung: Die OpenGL-Spezifikation garantiert, dass GL_TEXTUREx Werte sequenziell sind, aber ich bin nicht in der Lage, Verweis auf GL_COLOR_ATTACHMENTx zu finden, so würde ich erwarten, dass es implementation-defined sein. Obwohl ich vielleicht falsch liege. – Harrand

+0

@Harrand: "* Ich wollte dieses consExpr-Array so bearbeiten, dass es ALLE verfügbaren Anhänge bis auf das Minimum von 8 enthält. *" Da das tatsächliche Limit der Implementierung definiert ist, ist das * unmöglich * für alles, was Sie brauchen eine für die Kompilierung definierte Menge. –

Antwort

3

Wie festgestellt wurde, you cannot effectively use more than 32 attachments, weil glFramebufferTexture nichts außer einem Enumerator akzeptiert. GL_COLOR_ATTACHMENT0 + 32 gerade so zu sein GL_DEPTH_ATTACHMENT, so offensichtlich kann die Implementierung nicht den Unterschied zwischen der Verwendung einer Textur als der 33. Farbanhang und als Tiefenanhang unterscheiden. Es wird letzteres annehmen.

Also wirklich, machen Sie einfach eine Reihe von 32 Anlagen und weitermachen. Oder verwenden Sie einfach GL_COLOR_ATTACHMENT0 + i, wobei i kleiner als 32 ist. Die Enumeratoren in der Spezifikation sind tatsächlich sequenziell; Es ist nur, dass, im Gegensatz zu Textureinheit enums, niemand mehr Platz für mehr als 32 ließ. Sie können sogar eine constexpr Funktion erstellen, um solche Werte zu generieren, wenn Sie möchten.

+0

Guter Anruf. Scheint mir eine bessere Option zu sein, das consExpr-Array auf diese Weise zu erstellen, im Gegensatz zu GL_COLOR_ATTACHMENT0 bis 32, also werde ich das tun. – Harrand

Verwandte Themen