Jedes von Ihnen erstellte Texturobjekt has target associated with it. Wenn Sie das Objekt zum ersten Mal an den Kontext gebunden haben, haben Sie glBindTexture
eine bestimmte Zielerweiterung übergeben. GL_TEXTURE_2D
, GL_TEXTURE_CUBE_MAP
usw. Das Ziel, das Sie in Ihrem ersten Bindungsaufruf verwenden, wird untrennbar mit dem Texturobjekt verknüpft. Wenn Sie versuchen, es mit einem anderen Ziel zu binden, wird glBindTexture
Fehler.
GL_TEXTURE_2D
und GL_TEXTURE_2D_MULTISAMPLE
sind verschiedene Ziele. Wenn Sie ein neu erstelltes Texture-Objekt mit glBindTexture(GL_TEXTURE_2D, obj)
binden, können Sie es nicht später mit GL_TEXTURE_2D_MULTISAMPLE
binden. Und umgekehrt.
GLSL samplers types, wie Sie vielleicht bemerkt haben, haben Suffixe auf ihnen. Nun, diese Suffixe bezeichnen die Art der Textur, mit der der jeweilige Sampler-Typ arbeitet. sampler2D
ist ein Fließkomma-Sampler, der mit GL_TEXTURE_2D
Texturen arbeitet. Es wird daher nur eine Textur mit dem entsprechenden Ziel finden.
Wenn Sie eine sampler2D
Uniform gesetzt Textureinheit 0, zu verwenden und binden somethign zu GL_TEXTURE_2D_MULTISAMPLE
, dass Sampler wird es nicht sehen. Es wird nur nach einem GL_TEXTURE_2D
suchen, der an diesen Sampler gebunden ist.
Nun haben Sie vielleicht schon von view textures gehört. Dies sind Texturen, die Speicherplatz mit anderen Texturen teilen. Aber die Ansicht kann verschiedene Dimensionen und sogar Texturziele haben. Sie können eine einzelne Ebene aus einer 2D-Array-Textur als 2D-Textur anzeigen. Und so weiter.
Unter den Konvertierungen, die Sie nicht können Do ist eine Multisample-Textur als eine nicht Multisample-Textur zu sehen. Oder umgekehrt.
Also, wenn das, was Sie beschrieben, funktionierte, war es undefiniertes Verhalten. Und du kannst dich nicht darauf verlassen.
Dass gesagt wird:
Ist es notwendig, verschiedene Versionen des Shader
Nein zu kompilieren; Sie können einfach eine Variable nicht verwenden. Es ist absolut zulässig, zwei Sampler-Variablen verschiedener Typen zu haben und bedingt die Entscheidung zu treffen, ob man eine Sample-Variable gegen die andere abtastet. Wenn die Bedingung (für GL 4.x) ist dynamisch einheitliche, Sie won't even lose your implicit derivatives
Das einzige, was Sie tun müssen, ist sie verschiedene Textureinheiten verwenden zu machen.Versuche nicht, Spiele zu spielen, in denen du ihnen die gleiche Textureinheit zuweist und sie basierend auf dem, was du gebunden hast, entscheiden musst. Es funktioniert nicht (oder wenn es so ist, ist es UB).
Vielen Dank für Ihre ausführliche Antwort. Wissen Sie zufällig, ob die gleichmäßige Verzweigung im Fragment-Shader so leistungsfähig ist wie das Kompilieren von zwei verschiedenen Shadern? (bedenkt, dass nur eine Version während der Programmausführung verwendet wird, also kein zusätzliches Programm bindet) – user1282931