GLSL "in" structs
Darf ich nicht verwenden, eine Struktur mit der in
Stichwort, ich bin? Zum Beispiel:
struct Rect {
float x,y,width,height;
};
layout(location = 7) in Rect TexSrc;
Ist es schwierig zu Google, aber ich erhalte eine Fehlermeldung, wenn ich versuche, um meine GLSL shader (INVALID_OPERATION
). Es scheint, ich bin nutzen dürfen float[4]
jedoch.
Wenn ich bin nicht erlaubt, ein struct, was empfehlen Sie ich tun? Konstruieren Sie die Struktur aus einem float[4]
oder saugen Sie es auf, verzichten auf die nette API und verwenden Indizes 0-3 überall?
(A vec4
hier arbeiten würde, als gut, ich weiß, aber z
und w
haben nicht ganz die gleiche Bedeutung wie "Breite" und "Höhe", und dies ist nur ein Beispiel)
Ich nehme an, Sie können geben Sie nur eine einzige Art pro Standort mit glVertexAttribPointer
, damit ich sehen kann, warum eine Struktur wäre nicht zulässig... ich versuche nur zu denken, ein Weg, um meinen code sauber und ledgible ohne Kompromisse bei der Leistung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht vertex-shader-Eingaben von
struct
s.Den richtigen Weg, dies zu tun ist, nur kleben Sie in ein
vec4
. Wenn Sie einefloat[4]
erfordert dies vier Attribute statt nur einer. Arrays immer nehmen ein Attribut pro element. Also, wenn Sie nichtlayout(location = 7) in float[4] TexSrc;
werden die Attribut-Indizes, 7, 8, 9, und 10. Das ist eine schreckliche Verschwendung von Parametern, und es könnte die Leistung beeinträchtigen.Einfach ein
vec4
wie jeder andere auch. Menschen pack Eingänge invec4
s die ganze Zeit; Sie verwenden Sie Kommentare, um zu erklären, alle semantischen Merkwürdigkeiten.BTW, wenn Sie eine ungültige operation, das bedeutet wahrscheinlich, dass Sie nicht tatsächlich überprüfen, wenn der shader kompiliert und richtig verknüpft. Sollten Sie immer tun,.
Neue Sachen
OpenGL 4.4, oder die ARB_enhanced_layouts Erweiterung, erlauben Ihnen, etwas zu tun wie diese.
Wie gesagt, das Hauptproblem mit
layout(location = 7) in float[4] TexSrc;
ist, dass es dauert bis die 4 input-Standorten. Also, wenn Sie haben 4 Schwimmern, die nicht wirklich ein 4D-Vektor, müssen Sie noch pack Sie in einenvec4
für den Versand in die shader:Dies macht es viel schwieriger zu wissen, was
rect.z
bedeutet im shader, da hat es keine explizite Bedeutung.4.4/enhanced_layouts ermöglichen pack mehrere Variablen in einer einzigen Ort, so lange, wie Sie Ihre Komponenten nicht überschneiden. Also, wenn jeder Standort ist konzeptionell ein
vec4
können wir aufgeteilt in 2vec2
s:Nun bekommen wir einige semantische Informationen.
rectPos
ist die position des Rechtecks, währendrectSize
ist seine Größe. Und es ist noch immer auf nur einem Standort.Den erweiterten layouts-Funktion ermöglicht das arbeiten für alle Eingänge und Ausgänge, nicht nur der vertex Shader.
glLinkProgram
, aber es geschieht an anderer Stelle (wie aufglUseProgram
). Ich verwende einenvec4
dann. Wollte nur bestätigen, ich war auf der richtigen Spur, danke!#if DEBUG
blocks; Sie wird nicht selbst kompiliert in Version.glGetError
? Denn das ist es, was ich meinte. Das framework ruftglGetError
nach jedemgl*
Funktion und wirft das Ergebnis als eine Ausnahme.glLinkProgram
nicht über einen Rückgabewert, so gibt es nichts anderes für mich zu überprüfen, ist es? Tatsächlich, ich fand gerade dieseglGetProgramInfoLog
...muss ich nennen, dass die nach der Linksetzung?glGetShaderiv
w/GL_COMPILE_STATUS
und dannglGetShaderInfoLog
für mehr info. Sorry, sollte geprüft dem link. Danke!