Ich habe kürzlich ein Spiel ( LD21 ) erstellt, das einen Geometrie-Shader verwendet, um Punkte in strukturierte Dreiecke / Keulen umzuwandeln. Da ich den Eindruck hatte, dass die Unterstützung für # 330 weit verbreitet war, habe ich nur # 330-Shader geschrieben, aber es scheint, dass viele nicht so alte Hardware nur # 130 unterstützen (laut GLView)
Da ich nur mit der Kernfunktionalität von # 330 vertraut bin, habe ich Probleme, meine Shader auf # 130 umzuschreiben. Das Umschreiben des Fragment-Shaders war ziemlich trivial, aber ich habe es nur geschafft, meinen Scheitelpunkt- und Geometrie-Shader auf # 150 zu bringen.
Ist es also möglich, die Shader neu zu schreiben, oder wären viele Änderungen an meiner Rendering-Engine erforderlich?
Geometrie-Shader
#version 150
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
uniform mat4 oMatrix;
in VertexData
{
vec4 position;
vec4 texcoord;
vec4 size;
} vert;
out vec2 gTexCoord;
void main()
{
if(vert.position.x>-4f && vert.position.x<4f && vert.position.y>-2f && vert.position.y<2f)
{
gTexCoord=vec2(vert.texcoord.z,vert.texcoord.y);
gl_Position = vert.position + vec4(vert.size.x,vert.size.y,0,0);
EmitVertex();
gTexCoord=vec2(vert.texcoord.x,vert.texcoord.y);
gl_Position = vert.position + vec4(0.0,vert.size.y,0,0);
EmitVertex();
gTexCoord=vec2(vert.texcoord.z,vert.texcoord.w);
gl_Position = vert.position + vec4(vert.size.x,0.0,0,0);
EmitVertex();
gTexCoord=vec2(vert.texcoord.x,vert.texcoord.w);
gl_Position = vert.position;
EmitVertex();
EndPrimitive();
}
}
Vertex-Shader
#version 150
#extension GL_ARB_explicit_attrib_location : enable
layout (location = 0) in vec2 position;
layout (location = 1) in vec4 textureCoord;
layout (location = 2) in vec2 size;
uniform mat4 oMatrix;
uniform vec2 offset;
out VertexData
{
vec4 position;
vec4 texcoord;
vec4 size;
} outData;
void main()
{
outData.position = oMatrix * vec4(position.x+offset.x,position.y+offset.y,0,1);
outData.texcoord = textureCoord;
outData.size = oMatrix * vec4(size.x,size.y,0,0);
}
Antworten:
Zunächst einmal können Sie
struct
s nicht zum Variieren von Daten verwenden (geändert um 1,50), aber Sie können weiterhinin
undout
anstelle vonattribute
und verwendenvarying
. Zusätzlich müssen Sie in die eingebaute Variablegl_Position
im Vertex-Shader schreiben (geändert um 1.40). Ersetzen Sie also in Ihrem Vertex-Shader die Deklaration vonoutData
durch etwas Ähnliches wieund verwenden
gl_Position
stattoutData.position
.Ich bin nicht sicher, ob die Erweiterung ARB_explicit_attrib_location bereits der Kern ist. Vielleicht müssen Sie sie hinzufügen
Verwenden Sie die
layout
Syntax oder legen Sie einfach die Attributpositionen in der Anwendung fest, indem SieglBindAttribLocation
vor dem Verknüpfen des Shaders aufrufen , wenn diese Erweiterung nicht unterstützt wird.Ändern Sie im Geometrie-Shader die Dekralierung von vert in so etwas wie
Obwohl Sie nur eine einzige Eingabe erhalten (da Sie Punkte verwenden), müssen sie meiner Meinung nach immer noch Arrays sein (obwohl sie bei Verwendung immer mit indizieren
[0]
). Ändern Sie die Verwendung vonvert.position
togl_PositionIn[0]
.Als nächstes denke ich, dass die
layout
Syntax für den Geometrie-Shader in 1.50 eingeführt wurde, sodass Sie möglicherweise das Layout des Geometrie-Shaders in der Anwendung mithilfe von festlegen müssenglProgramParameteri
.Ich muss zugeben, dass ich nicht viel praktische Erfahrung mit Geometrie-Shadern oder der modernen Syntax habe, da ich immer noch auf 2.1-Hardware sitze, aber all diese Änderungen lassen sich aus den jeweiligen Spezifikationen ableiten . Schauen Sie sich einfach die Shader-Info-Protokolle an, wenn beim Kompilieren (oder Verknüpfen) keine Hinweise darauf erhalten werden, was möglicherweise falsch ist.
Das Fehlen der
layout
Syntax sowohl im Scheitelpunkt als auch im Geometrie-Shader sind die einzigen Dinge, die möglicherweise einige kleine Ergänzungen zu Ihrem Anwendungscode erfordern, aber ich bin nicht ganz sicher, ob sie wirklich nicht unterstützt werden. Versuchen Sie es also zuletzt.Sie können Ihre Frage auch aktualisieren, wenn ich etwas verpasst habe und die Shader immer noch nicht funktionieren, möglicherweise diesmal mit einigen Fehlermeldungen vom GLSL-Compiler.
quelle
position
variierendento
gl_Position ändern.