OpenGL4.5 - Binde mehrere Texturen und Sampler

8

Ich versuche, Texturen, Textureinheiten und Sampler in OpenGL 4.5 zu verstehen. Ich füge ein Bild von dem an, was ich herausfinden möchte. Ich denke in meinem Beispiel ist alles in Ordnung, aber ich bin mir nicht so sicher über den 1D Sampler auf der rechten Seite mit dem Fragezeichen.

Also weiß ich, dass OpenGL eine Anzahl von Textureinheiten / Bindepunkten anbietet, wo Texturen und Sampler gebunden werden können, damit sie zusammen funktionieren.

Jeder dieser Bindungspunkte kann eines von jedem Texturziel unterstützen (in meinem Fall verbinde ich die Ziele GL_TEXTURE_2D und GL_TEXTURE_1D mit dem Bindungspunkt 0 und ein weiteres GL_TEXTURE_2D mit dem Bindungspunkt 1 ).

Außerdem können Sampler auf diese Weise an diese Bindungspunkte gebunden werden (ich habe einen 2D-Sampler an den Bindungspunkt 0 im Bild gebunden).

Die Funktionen zum Ausführen dieser Operationen sind glBindTextureUnit und glBindSampler .

Mein erster Gedanke war, den 1D-Sampler auch an den Bindungspunkt 0 zu binden, und in der Shader-Landetabelle die Übereinstimmung basierend auf dem Bindungspunkt und dem Typ des Samplers:

%Vor%

Zitieren der Quelle:

  

Jede Texturbildeinheit unterstützt Bindungen an alle Ziele. Also ein 2D   Textur und eine Array-Textur können an dieselbe Bildeinheit gebunden werden oder   Verschiedene 2D Texturen können in zwei verschiedenen Bildeinheiten eingebunden werden   ohne einander zu beeinflussen. Also welche Textur wann benutzt wird   Rendern? In GLSL hängt dies vom Typ des Samplers ab, der dies verwendet   Texturbildeinheit.

aber ich fand die folgende Aussage:

  

[..] klingt verdächtig, als könnten Sie die gleiche Texturbildeinheit verwenden   für verschiedene Sampler, solange sie unterschiedliche Texturtypen haben.   Mach das nicht. Die Spezifikation verbietet dies explizit; wenn zwei verschiedene   GLSL-Sampler haben unterschiedliche Texturtypen, sind aber assoziiert   die gleiche Texturbildeinheit, dann wird das Rendering fehlschlagen. Gib jedem   Sampler eine andere Textur Bildeinheit.

Meine Frage ist also, welcher Zweck es ist, verschiedene Texturziele an den gleichen Bindungspunkt zu binden, wenn letztendlich ein einzelner Sampler an diesen Bindungspunkt gebunden wird und Sie zwingt zu wählen?

Die Informationen, die ich zitiere: Ссылка

    
Carlos Romero 21.07.2017, 09:09
quelle

2 Antworten

6

Warum gibt es das? Nun ...

Es gab einmal keine Textureinheiten (deshalb ist glActiveTexture eine separate Funktion von glBindTexture ). Tatsächlich gab es in OpenGL 1.0 nicht einmal Textur Objekte . Aber es musste immer noch verschiedene Arten von Texturen geben. Sie mussten weiterhin Daten für eine 2D-Textur und eine 3D-Textur erstellen können. Sie haben also die Unterscheidung der Texturziele getroffen und mithilfe von glEnable s ermittelt, welches Ziel in einer Rendering-Operation verwendet wird.

Wenn Texturobjekte in GL 1.1 entstanden sind, mussten sie sich über die Beziehung zwischen einem Texturobjekt und dem Ziel entscheiden. Sie entschieden, dass sobald ein Objekt an ein Ziel gebunden war, es permanent mit diesem Ziel verbunden war. Aufgrund der oben erwähnten Notwendigkeit, mehrere Texturen unterschiedlicher Typen zu haben, wurde mit der alten Aktivierungsfunktionalität entschieden, dass jedes Ziel einen separaten Objektbindungspunkt darstellt. Und sie haben dich dazu gebracht, den Bindungspunkt in glBindTexture zu wiederholen, so dass es dem Leser des Codes klar sein würde, welche Daten des Bindungspunktes du störst.

Schnitt zu OpenGL 1.2, wenn Multitexture herauskam. Sie müssen also jetzt in der Lage sein, mehrere Texturen desselben Ziels zu binden, aber zu verschiedenen "Einheiten". Sie konnten glBindTexture jedoch nicht ändern, um eine bestimmte Einheit anzugeben. das wäre eine rückwärtskompatible Veränderung.

Nun könnten sie die Funktionsweise von Texturen komplett überarbeitet haben und eine neue Bindungsfunktion speziell für Multitexturing und Ähnliches geschaffen haben. Aber der OpenGL ARB liebt Rückwärtskompatibilität; Sie möchten, dass die alten API-Funktionen funktionieren, egal wie die resultierende API aussieht. Stattdessen entschieden sie sich dafür, dass eine Textureinheit eine ganze Menge von Bindungen sein würde, wobei jede Menge einen Aktivierungszustand hätte, der aussagt, welches Ziel das zu verwendende war. Und Sie wechseln zwischen Einheiten mit glActiveTexture .

Natürlich, sobald Shader entstanden sind, könnt ihr sehen, wie sich das alles ändert. Der Aktivierungsstatus wird zum Samplertyp im Shader. Es gibt also keinen expliziten Code, der beschreibt, welches Texturziel aktiviert ist. es sind nur Shader-Sachen. Sie mussten also eine Regel erstellen, die besagt, dass zwei Sampler die gleiche Einheit nicht verwenden können, wenn sie unterschiedliche Typen sind.

Deshalb hat jede Textureinheit mehrere unabhängige Bindungspunkte: OpenGLs Verpflichtung zur Abwärtskompatibilität.

Es ist am besten zu ignorieren, dass diese Fähigkeit existiert. Binden Sie die richtigen Texturen, die Ihr bestimmter Shader benötigt. Konzentrieren Sie sich also darauf, diese Funktionen zu verwenden, und machen Sie sich keine Sorgen darüber, dass Sie zwei Texturen an dasselbe Ziel binden können. Wenn Sie sicherstellen möchten, dass Sie nicht versehentlich die falsche Textur verwenden, können Sie glBindTextures oder glBindTextureUnit mit einem Texturnamen von 0 verwenden, der alle Ziele in den jeweiligen Textureinheiten entbindet.

    
Nicol Bolas 21.07.2017, 14:41
quelle
-2

Nehmen wir an, Sie haben zwei GLSL-Programme:

in ProgA:

%Vor%

in progB:

%Vor%

Und Sie haben mehrere Texturen mit den Namen text1D_1, text1D_2, text1D_3, ... text2D_1, text2D_2, etc

Nehmen wir nun an, Sie möchten progA aus text1D_1 und text2D_1 und progB aus sample1D_2 und text2D_2 sampeln

Sie wissen bereits, dass jeder Sampler einer texture unit und nicht einem texture name zugeordnet sein muss. Wir können nicht die gleiche Textureinheit für beide Sampler progA_sampler1D und progA_sampler2D verwenden

ERSTE OPTION: vier Textureinheiten

%Vor%

ZWEITE OPTION: zwei Textureinheiten

%Vor%

Beachten Sie, dass die Unit GL_TEXTURE0 + 1 zwei Texturen text1D_1 und text2D_2 mit unterschiedlichen Typen gebunden hat.
Auf die gleiche Weise hat GL_TEXTURE0 + 2 zwei Texturen gebunden, vom Typ GL_TEXTURE_2D und GL_TEXTURE_1D

FALSCHE OPTION: zwei Textureinheiten

%Vor%     
Ripi2 21.07.2017 14:49
quelle