Wie mache ich eine Texturierung mit OpenGL Direct State Access?


8

Wie verwenden Sie Texturen mit direktem Statuszugriff in OpenGL?

Ich habe Folgendes in meinem Code, was zu funktionieren scheint:

GLuint textureHandle;
glGenTextures(1, &textureHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Wenn ich es jedoch durch Folgendes ersetze, wird alles nur schwarz:

GLuint textureHandle;
glActiveTexture(GL_TEXTURE0);
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureImage2DEXT(textureHandle, GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Antworten:


11

Sie müssen die gewünschte Textur noch an die Textureinheit binden, um sie zum Rendern verwenden zu können. In Ihrem aktuellen Code geben Sie nicht an, welche Textur für das Rendern verwendet werden soll, sodass der GL-Treiber nicht weiß, welche Sie verwenden möchten, und standardmäßig "keine Textur" verwendet.

Es gibt verschiedene Möglichkeiten, eine Textur zu binden. Sie können glActiveTexture+ weiterhin glBindTexturewie in Ihrem Nicht-DSA-Code verwenden, oder Sie können entweder glBindTexturesoder verwenden glBindTextureUnit.

Führen Sie zum Beispiel glBindTextureUnitFolgendes aus:

glBindTextureUnit(0, textureHandle);

Der erste Parameter ist die Textureinheit, an die gebunden werden soll.

Übrigens, anstatt zu verwenden glTextureImage2DEXT(was von der alten und veralteten EXT_direct_state_access-Erweiterung stammt), ist es wahrscheinlich besser, bei OpenGL-Kernaufrufen zu bleiben. Sie können die Textur initialisieren, indem Sie glTextureStorage2Dden Speicher zuweisen, das Format festlegen und dann glTextureSubImage2Ddie Daten hochladen.

( Hier ist ein Artikel mit mehr Informationen zu den Unterschieden zwischen EXT_direct_state_access und der neueren Kernversion der Funktionalität, wenn Sie interessiert sind.)


1
" Vielleicht möchten Sie Ihren Code konvertieren, um ihn zu verwenden, wenn dies möglich ist. " Sein Code verwendet ihn . glCreateTexturesist spezifisch für die ARB_DSA-Funktion. Er verwendet eine seltsame Mischung aus beiden, wahrscheinlich weil er glTextureImage2Din der ARB-Version keine finden konnte (da der ARB nicht unveränderliche Texturen entmutigen möchte).
Nicol Bolas

1
@NicolBolas Aha, danke, das hatte ich nicht verstanden. Ich habe die Antwort erneut aktualisiert.
Nathan Reed

6

Ich habe es jetzt durch folgendes ersetzt, was funktioniert:

GLuint textureHandle;
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureStorage2D(textureHandle, 1, GL_RGBA8, imageW, imageH);
glTextureSubImage2D(textureHandle, 0, 0, 0, imageW, imageH, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTextureUnit(0, textureHandle);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.