2017-08-27 1 views
3

Ich bin sehr neu in der OpenGL API und habe gerade Texturen entdeckt und wie man sie benutzt. Die generierten Texturpuffer sind nicht auf die gleiche Weise gebunden wie reguläre Uniformen und verwenden stattdessen glActiveTexture, gefolgt von einer Bindung, anstatt nur die Textur über glUniform an die Shader zu liefern, wie wir es mit anderen Konstanten tun.Was sind die Gründe für OpenGL-Textureinheiten im Gegensatz zu regulären Puffern und Uniformen?

Was ist der Grund für diese Konvention?

Der einzige Grund, den ich mir vorstellen kann, ist die volle Nutzung der Grafikkartenpotential- und Texturverarbeitungsfähigkeiten, anstatt nur Puffer direkt zu binden. Ist das richtiger Beweis, oder ist es einfach die Art, wie die API implementiert wurde?

Keine Argumentation auf der offiziellen Wiki gegeben wird, sagt nur, dass es seltsam ist: „für Texturen Binding Verwendung in OpenGL ist ein wenig seltsam“ https://www.khronos.org/opengl/wiki/Texture

+1

[Verwandte wenn nicht duplizieren] (https://stackoverflow.com/questions/45233643/opengl4-5-bind-multiple-textures-and-samplers/45240467#45240467) – Borgleader

+0

Ich gucke mal, ob es beantwortet meine Frage, danke. Hab das nicht gesehen. – Timothy

+0

Wenn Sie "direkten Statuszugriff" (DSA) verwenden, ist die API viel sinnvoller. Angenommen, Sie verwenden GL Core 4.5 oder höher. – Robinson

Antwort

0

Sie vergleichen zwei völlig verschiedene Dinge

Ein Textur-Objekt kann (irgendwie) mit einem Pufferobjekt verglichen werden. Die Textur ist durch eine Kombination von glActiveTexture und glBindTexture an eine Textureinheit gebunden, wohingegen ein Puffer durch glBindBuffer gebunden ist, was ähnlich ist.

Eine Textur Sampler Uniform ist eine Uniform im Shader und sollte daher mit anderen Uniformen verglichen werden. Dieser Sampler ist durch einen glUniform1i Aufruf festgelegt.

+0

So ist der Sampler, was durch die uniforme Aufrufe festgelegt wird und sie erhalten ihre Texturdaten aus den Textureinheiten. Ich habs. Aber was ist der Grund dafür, dass es so gemacht wird, anstatt nur eine riesige Auswahl an Pixelfarben (die Textur), die normalerweise an die Shader gesendet werden? Hardware Vorteile? – Timothy

+0

@Timothy: "* Aber was ist der Grund, warum du es so gemacht hast, anstatt nur eine riesige Auswahl an Pixelfarben (die Textur), die normalerweise an die Shader gesendet werden? *" Was meinst du mit "normal"? Es gibt keine "normale" Möglichkeit, ein "riesiges Array von Pixelfarben" an einen Shader zu senden. Die meisten Texturen würden leicht die Speichergrenzen von gleichförmigen Arrays oder sogar UBOs übertreffen. –

+0

@NicolBolas Große Texturen können die Grenzen sprengen, kleinere Texturen hingegen nicht. Sie sagen also, dass die Antwort einfach die Speichergröße betrifft? – Timothy

5

Ihre Frage kann auf zwei Arten interpretiert werden.

"Warum binden wir Texturen an den Kontext und nicht an den Shader?"

Da würde es unnötig schwierig machen, mehrere Shader die gleichen Texturen zu verwenden. Beachten Sie, dass so gut wie keine Grafik-API die Textur direkt an das Programm anfügt. Nicht D3D irgendeiner Version, nicht Metal, nicht einmal Vulkan.

Texturen sind Ressourcen, die von Shadern verwendet werden. Aber sie sind nicht Teil des Shaders.

"Warum behandeln wir Texturen anders als eine allgemeine Reihe von Werten?"

In modernen OpenGL haben Shader Zugriff auf verschiedene Arten von Ressourcen: UBOs, SSBOs, Texturen und Bilder. Jede dieser Arten von Ressourcen stellt letztendlich einen potenziell unterschiedlichen Teil der Grafikhardware dar.

Ein Speicherblock ist nicht nur ein einheitlicher Block, der größer sein kann. Speicherpuffer repräsentieren den Shader, der globale Speicherzugriffe ausführt, während einheitliche Blöcke oft direkt in die Shader-Ausführungseinheiten kopiert werden. In letzterem Fall ist der Zugriff auf ihre Daten viel schneller, aber das bedeutet auch, dass Sie durch die Speicherkapazität dieser Ausführungseinheiten eingeschränkt sind.

Nun gilt dies nicht für alle Hardware (AMD GCN Hardware behandelt die beiden fast identisch, weshalb their UBO limits are so large). Aber es trifft auf viel Hardware zu.

Texturen sind noch komplizierter, weil Implementierungen aus Performancegründen ihre Daten optimal speichern müssen. Daher sind Texturspeicherformate undurchsichtig. Sie sind sogar undurchsichtig in angeblich Low-Level-APIs wie Vulkan. Sicher, lineare Formate existieren, aber Implementierungen sind nicht erforderlich, damit Sie überhaupt von ihnen lesen können.

Texturen sind also nicht nur konstante Arrays.

+0

Danke. Das beantwortet meine Frage gut. :) – Timothy

Verwandte Themen