glProgramParameterARB

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glProgramParameterARB

Name

glProgramParameterARB - Setzt spezifische Objekt-Parameter für ein Shaderprogramm.


Delphi-Spezifikation

procedure glProgramParameteriARB(program_ : GLuint; pname : GLenum; value: GLint);

Parameter

program_ Shaderprogramm, für dass spezifischer Parameter übergeben werden soll. ( Siehe glCreateProgram )
pname Parametername. Erlaubt sind GEOMETRY_INPUT_TYPE_ARB, GEOMETRY_OUTPUT_TYPE_ARB und GL_GEOMETRY_VERTICES_OUT_ARB.
value Wert für pname.


Beschreibung

GEOMETRY_INPUT_TYPE_ARB

Setzt den Typ der Input-Primitive für einen Geometry-Shader und beinflusst die Grösse seiner Input-Arrays. Defaultwert ist GL_TRIANGLES.
Ein Geometry Shader kann auf einem von 5 Typen von Input-Primitiven operieren. Abhängig vom Typ der Input-Primtive stehen 1 bis 6 Vertices zur Verfügung wenn der Shader ausgeführt wird. Jeder Input-Primitiven-Typ unterstützt eine Untermenge an Primitiven, die von GL zur Verfügung gestellt werden. Bei einem aktiviertem Geometry Shader wird glBegin, oder jede andere Funktion, die implizit glBegin aufruft, einen GL_INVALID_OPERATION-Fehler produzieren, falls der mode-Parameter mit dem Typ der Input-Primitive des momentan aktiven Programm-Objektes inkompatibel ist.
Der Input-Primitiven-Typ ist ein Parameter des Programm-Objektes und muß vor dem Linken mittels glProgramParameteriARB mit pname GEOMETRY_INPUT_TYPE_ARB und value GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, GL_TRIANGLES oder GL_TRIANGLES_ADJACENCY_ARB gesetzt werden. Die Einstellung wird erst eine Auswirkung haben, wenn glLinkProgram erfolgreich aufgerufen wurde.
Unterstützte Typen von Input-Primitiven für pname:
GL_POINTS ( Punkte )
Geometry Shader, die auf Punkten operieren, sind nur für GL_POINTS Primitiv-Typen gültig. Für jeden Durchlauf des Geometry Shaders steht nur ein einzelner Vertex zur Verfügung.
GL_LINES ( Linien )
Geometry Shader, die auf Liniensegmenten operieren, sind nur für GL_LINES, GL_LINE_STRIP und GL_LINE_LOOP Primitiv-Typen gültig. Für jeden Durchlauf des Geometry Shaders stehen zwei Vertices zur Verfügung. Der erste Vertex bezieht sich auf den Vertex vom Anfang und der zweite Vertex bezieht sich auf den Vertex vom Ende des Liniensegments.
GL_LINES_ADJACENCY_ARB ( Linien mit Nachbarschaft )
Geometry Shader, die auf Liniensegmenten mit Nachbar-Vertices operieren, sind nur für GL_LINES_ADJACENCY_ARB und GL_LINE_STRIP_ADJACENCY_ARB Primitiv-Typen gültig. Für jeden Programmaufruf stehen vier Vertices zur Verfügung. Der zweite Vertex bezieht sich auf den Vertex vom Anfang und der dritte Vertex bezieht sich auf den Vertex vom Ende des Liniensegments. Erster und vierter Vertex beziehen sich auf die, zum Anfang und Ende des Liniensegments benachbarten Vertices.
GL_TRIANGLES ( Dreiecke )
Geometry Shader, die auf Dreiecken operieren, sind nur für GL_TRIANGLES, GL_TRIANGLE_STRIP und GL_TRIANGLE_FAN Primitiv-Typen gültig. Für jeden Programmaufruf stehen drei Vertices zur Verfügung. Der erste, zweite und dritte Vertex beziehen sich auf Attribute des entsprechenden ersten, zweiten und dritten Vertex vom Dreieck.
GL_TRIANGLES_ADJACENCY_ARB ( Dreiecke mit Nachbarschaft )
Geometry Shader, die auf Dreiecken mit benachbarten Vertices operieren, sind nur für GL_TRIANGLES_ADJACENCY_ARB und GL_TRIANGLE_STRIP_ADJACENCY_ARB Primitiv-Typen gültig. Für jeden Programmaufruf stehen sechs Vertices zur Verfügung. Die ersten, dritten und fünften Vertices beziehen sich auf Attribute des entsprechenden ersten, zweiten und dritten Vertex des Dreiecks. Die zweiten, vierten und sechsten Vertices beziehen sich auf Attribute von Vertices, die entsprechend zu den Kanten vom ersten zum zweiten Vertex, vom zweiten zum dritten Vertex, und vom dritten zum ersten Vertex benachbart sind.

Input-Typen

Eine Übersicht über die auf Seiten der Anwendung erlaubten Primitiv-Typen (links) und ihre Entsprechungen als Input-Geometrie im Geometryshader (rechts) [2].

Primitiv-Typ ( Anwendung ) Primitiv-Typ ( Shader ) Wert von
gl_VerticesIn
GL_POINTS GL_POINTS 1
GL_LINES GL_LINES 2
GL_LINE_STRIP
GL_LINE_LOOP
GL_LINES_ADJACENCY_EXT GL_LINES_ADJACENCY_EXT 4
GL_LINE_STRIP_ADJACENCY_EXT
GL_TRIANGLES GL_TRIANGLES 3
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_TRIANGLES_ADJACENCY_EXT GL_TRIANGLES_ADJACENCY_EXT 6
GL_TRIANGLE_STRIP_ADJACENCY_EXT
GL_QUADS nicht definiert?
Möglicherweise GL_TRIANGLES?
GL_QUAD_STRIP
GL_POLYGON


GEOMETRY_OUTPUT_TYPE_ARB

Setzt den Typ der Output-Primitive eines Geometry-Shaders und beeinflusst die Grösse seiner Output-Arrays. Defaultwert ist GL_TRIANGLE_STRIP.
Ein Geometry Shader kann eines von drei verschiedene Typen von Primitiven generieren. Die unterstützten Typen von Ouput-Primitiven sind Punkte ( GL_POINTS ), Line Strips ( GL_LINE_STRIP ) und Triangle Strips ( GL_TRIANGLE_STRIP ). Die Output Vertices werden entsprechend des Typs der Output-Primitive in Punkte, Linien oder Dreiecke durch den Geometry Shader zerlegt. Falls die Anzahl der von dem Geometry Shader generierten Vertices nicht ausreicht um eine einzelne Primitive zu erzeugen, wird nichts gezeichnet.
Der Typ der Output-Primitive ist ein Parameter des Programm-Objektes und kann via glProgramParameteriARB mit pname gleich GL_GEOMETRY_OUTPUT_TYPE_ARB und value gleich GL_POINTS, GL_LINE_STRIP oder GL_TRIANGLE_STRIP gesetzt werden. Die Einstellung tritt allerdings erst dann in Kraft, wenn glLinkProgram das nächste Mal erfolgreich aufgerufen wurde.


GL_GEOMETRY_VERTICES_OUT_ARB

Gibt die maximale Anzahl von Vertices an, die ein Geometry-Shader erzeugen darf. Ist zu Beginn auf 0 gesetzt.
Die Anzahl der Vertices, die ein Geometry Shader pro Durchlauf generieren darf, ist beschränkt. Die maximale Anzahl an Vertices, die ein Geometry Shader möglicherweise generiert muß als Parameter des Programm-Objektes gesetzt werden, welcher den entsprechenden Geometry Shader enthält. Um dies zu tun sollte man glProgramParameteriARB mit pname gleich GL_GEOMETRY_VERTICES_OUT_ARB und value gleich der maximalen Anzahl an Vertices, die ein Geometry Shader in einem Durchlauf generieren wird, aufrufen. Es wird nicht garantiert, dass die Einstellung in Kraft tritt, bevor glLinkProgram das nächste Mal aufgerufen wurde. Falls ein Geometry Shader in einem Durchlauf mehr Vertices generiert als der Wert von GL_GEOMETRY_VERTICES_OUT_ARB, dürften die zusätzlichen ausgegebenen Vertices keine Auswirkungen haben.
Es gibt zwei implementationsabhängige Einschränkungen für den Wert von GL_GEOMETRY_VERTICES_OUT_ARB. Erstens wird von glProgramParameteriARB ein GL_INVALID_VALUE-Fehler generiert, falls die Anzahl der angegebenen Vertices den Wert GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB übertrifft. Zweitens darf dass Produkt der Gesamtanzahl an Vertices und der Summe aller Komponenten aller aktiven Varying-Variablen nicht den Wert GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB überschreiten. glLinkProgram schlägt fehl, falls festgestellt wurde, dass die total component-Grenze verletzt wurde.

Hinweise

Abfragen von GL_GEOMETRY_INPUT_TYPE_ARB oder GL_GEOMETRY_OUTPUT_TYPE_ARB liefern den zuletzt gesetzten Wert zurück. Dies ist nicht unbedingt der Wert, der im generierten ausführbaren Code im Programm-Objekt benutzt wurde. Nachdem ein Programm-Objekt erzeugt wurde, hat dieses für GL_GEOMETRY_INPUT_TYPE_ARB zunächst den Defaultwert GL_TRIANGLES und für GL_GEOMETRY_OUTPUT_TYPE_ARB den Defaultwert GL_TRIANGLE_STRIP.

Ein Geometry Shader, der auf mehr Input-Vertices zugreift als für einen gegebenen Input-Primitiven-Typ zur Verfügung stehen, kann erfolgreich kompiliert werden, denn der Input-Primitiven-Typ ist nicht Teil des Shader-Objektes. Auf jeden Fall kann jedoch ein Programm-Objekt, welches dieses Shader-Objekt enthält, nicht gelinkt werden.

glProgramParameteriARB gehört zu den Kommandos, die nicht in eine Displayliste kompiliert, sondern sofort ausgeführt werden.

Fehlermeldungen

GL_INVALID_VALUE wird generiert, wenn pname GL_GEOMETRY_OUTPUT_TYPE_ARB und value weder GL_POINTS, GL_LINE_STRIP oder GL_TRIANGLE_STRIP ist.

GL_INVALID_VALUE wird generiert, wenn pname GL_GEOMETRY_VERTICES_OUT_ARB und value negativ ist.

GL_INVALID_VALUE wird generiert, wenn pname GL_GEOMETRY_VERTICES_OUT_ARB ist und value den Wert GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB überschreitet.

GL_INVALID_VALUE wird generiert, wenn pname GL_GEOMETRY_VERTICES_OUT_ARB ist und das Produkt aus value und der Summe aller Komponenten aller aktiven Varying-Variablen den Wert von GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB überschreitet.

INVALID_OPERATION wird generiert, wenn glBegin oder jedes andere Kommando, dass glBegin implizit aufruft, aufgerufen wird, wenn ein Geometry Shader aktiv ist und :

  • der Input-Primitiven-Typ des momentanen Geometry Shaders GL_POINTS und mode nicht GL_POINTS ist,
  • der Input-Primitiven-Typ des momentanen Geometry Shaders GL_LINES und mode weder GL_LINES, GL_LINE_STRIP noch GL_LINE_LOOP ist,
  • der Input-Primitiven-Typ des momentanen Geometry Shaders GL_TRIANGLES und mode weder GL_TRIANGLES, GL_TRIANGLE_STRIP noch GL_TRIANGLE_FAN ist,
  • der Input-Primitiven-Typ des momentanen Geometry Shaders GL_LINES_ADJACENCY_ARB und mode weder GL_LINES_ADJACENCY_ARB noch GL_LINE_STRIP_ADJACENCY_ARB ist, oder
  • der Input-Primitiven-Typ des momentanen Geometry Shaders GL_TRIANGLES_ADJACENCY_ARB und mode weder GL_TRIANGLES_ADJACENCY_ARB noch GL_TRIANGLE_STRIP_ADJACENCY_ARB ist.

Zugehörige Wertrückgaben

glGetProgram mit Token GL_GEOMETRY_VERTICES_OUT_ARB

glGetProgram mit Token GL_GEOMETRY_INPUT_TYPE_ARB

glGetProgram mit Token GL_GEOMETRY_OUTPUT_TYPE_ARB

glGet mit Token GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB

glGet mit Token GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB

Siehe auch

glAttachShader, glCreateShader, glDeleteShader, glDeleteProgram, glDetachShader, glLinkProgram, glUseProgram, glValidateProgram

Hintergrundwissen : Shader

Extensions : GL_ARB_geometry_shader4 bzw. GL_EXT_geometry_shader4

Englische Originalversion ( Copyright 1997 - 2009 Khronos Group )