2016-05-10 20 views

Antwort

8
layout(binding = 0) uniform sampler2D img_input; 

dass ein sampler erklärt, die ihre Daten von einem Textur-Objekt bekommt. Die Bindung von 0 (Sie können dies im Shader in GLSL 4.20 festlegen) besagt, dass die 2D-Textur, die an die Texturbildeinheit 0 (über glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);) gebunden ist, die Textur ist, die für diesen Sampler verwendet wird.

Sampler verwenden die gesamte Textur, einschließlich aller Mipmap-Ebenen und Array-Layer. Die meisten Funktionen zur Texturabtastung verwenden normalisierte Texturkoordinaten ([0, 1] entspricht der Größe der Textur). Die meisten Texturabtastfunktionen berücksichtigen auch filtering properties and other sampling parameters.

layout (binding = 0, rgba32f) uniform image2D img_input; 

Dies erklärt, ein Bild, das ein einzelnes Bild aus einer Textur darstellt. Texturen können have multiple images: Mipmap-Ebenen, array layers usw. Wenn Sie glBindTextureImage verwenden, binden Sie ein einzelnes Bild aus einer Textur.

Bilder und Sampler sind vollständig getrennt. Sie haben ihre eigenen Bindungsindizes; Es ist absolut zulässig, eine Textur an GL_TEXTURE0 und ein Bild von einer anderen Textur an Bildbindung 0 zu binden. Die Verwendung von Texturfunktionen für den zugehörigen Sampler liest von dem, was an GL_TEXTURE0 gebunden ist, während Bildfunktionen auf der verknüpften Bildvariablen aus dem Bild lesen gebunden an Bildbindung 0.

Der Bildzugriff ignoriert alle Sampling-Parameter. Image accessing functions verwenden Sie immer Integer-Texel-Koordinaten.

Sampler können nur Daten von Texturen lesen; Bildvariablen können Daten lesen und/oder schreiben sowie atomare Operationen an ihnen ausführen. Natürlich erfordert das Schreiben von Daten von Shadern besondere Sorgfalt, insbesondere wenn someone goes to read that data.