glFeedbackBuffer

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glFeedbackBuffer

Name

glFeedbackBuffer - steuert den Feedback-Modus.


Delphi-Spezifikation

procedure glFeedbackBuffer(size: TGLsizei; _type: TGLenum; buffer: PGLfloat);


Parameter

size Bestimmt die maximale Anzahl Einträge die in den Puffer geschrieben werden können.
_type Bestimmt eine symbolische Konstante die bestimmt, welche Informationen für jeden Vertex zurückgeliefert werden. Akzeptiert werden:
GL_2D, GL_3D, GL_3D_COLOR, GL_3D_COLOR_TEXTURE, und GL_4D_COLOR_TEXTURE.
buffer Liefert die Feedbackdaten zurück.


Beschreibung

glFeedbackBuffer steuert das Feedback. Feedback ist, genau wie Selektion, ein GL-Modus. Der Modus kann über einen Aufruf von glRenderMode mit GL_FEEDBACK ausgewählt werden. Wenn die GL im Feedbackmodus ist, werden keine Pixel durch die Rasterierung produziert. Anstelle dessen werden Informationen bezüglich der Primitive die gerastert worden wären zur Anwendung, über den FeedbackBuffer, zurückgeliefert.

glFeedbackBuffer hat drei Parameter:

  1. buffer ist ein Zeiger auf ein Feld von Fließkommazahlen in das die Feedbackinformationen eingetragen werden.
  2. size gibt die Größe des Feldes an.
  3. type ist eine symbolische Konstante welche die Informationen beschreibt, die für jeden Vertex in das Feld eingetragen werden.

glFeedbackBuffer muss aufgerufen werden bevor der Feedbackmodus aktiviert wird (durch einen Aufruf von glRenderMode mit dem Argument GL_FEEDBACK). Aktivieren des Feedbackmodus ohne vorheriges Aufsetzen eines Feedbackbuffers oder ein Aufruf von glFeedbackBuffer wenn die GL bereits im Feedbackmodus ist führen zu einem OpenGL Fehler. (siehe Abschnitt Fehlermeldungen)

Um den Feedbackmodus wieder zu verlassen rufen Sie glRenderMode mit einem anderen Parameter als GL_FEEDBACK auf. Wenn Sie dies tun während die GL im Feedbackmodus ist (Dies muss ja gegeben sein, denn schließlich wollen Sie den Modus ja ändern.), liefert glRenderMode die nzahl der Einträge im Feedbackbuffer (dem oben genannten Feld) zurück. Dieser zurückgelieferte Wert ist übersteigt niemals size. Wenn in buffer nicht genug Platz war um alle Daten unter zu bringen, liefert glRenderMode einen negativen Wert zurück.

Während man sich im Feedbackmodus befindet, generiert jedes Primitiv das rasterisiert werden würde einen Werteblock, der in das Feedbackarray kopiert wird. Wenn dies die Zahl der Einträge im Puffer überschreitet, dann wird dieser Werteblock teilweise in das Array geschrieben, so dass das Array komplett gefüllt wird (vorausgesetzt es ist noch Platz darin), und ein Überlauf-Flag wird gesetzt. Jeder Block beginnt mit einem Code, der den Primitiventyp beschreibt, gefolgt von Werten die die Eckpunkte und zugehörige Daten der Primitive beschreiben. Einträge für Bitmaps und Pixelrechtecke werden auch geschrieben.

Feedback findet statt, nachdem das Polygon gecullt wurde und glPolygonMode interptretiert wurde, so dass gecullte Polygone nicht im Feedbackpuffer landen. Er kann auch stattfinden, nachdem (je nach GL-Implementation) Polygone von der Implementation in Dreiecke zerlegt wurden.

Der Befehl glPassThrough kann benutzt werden, um eine Markierung in den Feedbackbuffer einzufügen.

Nachfolgend finden Sie die Grammatik für die Datenblöcke die in den Feedbackpuffer geschrieben werden.
Jedes Primitiv wird durch einen einmaligen Identifikationswert gefolgt von einer Menge von Vertices beschrieben.
Einträge von Polygonen enthalten einen Integerwert der angibt wie viele Vertices folgen.
Jeder Vertex wird durch eine Reihe von Fließkommazahlen zurückgeliefert. (type bestimmt dabei welche Zahlen angegeben werden.)
Farben werden als vier Werte im RGBA-Modus und als Einzelwert im Farbindexmodus zurückgeliefert.

feedbackList   <-- feedbackItem feedbackList | feedbackItem
feedbackItem   <-- point | lineSegment | polygon | bitmap | pixelRectangle | passThru
point          <-- GL_POINT_TOKEN vertex
lineSegment    <-- GL_LINE_TOKEN vertex vertex | GL_LINE_RESET_TOKEN vertex vertex
polygon        <-- GL_POLYGON_TOKEN n polySpec
polySpec       <-- polySpec vertex | vertex vertex vertex
bitmap         <-- GL_BITMAP_TOKEN vertex
pixelRectangle <-- GL_DRAW_PIXEL_TOKEN vertex | GL_COPY_PIXEL_TOKEN vertex
passThru       <-- GL_PASS_THROUGH_TOKEN Wert
vertex         <-- 2d | 3d | 3dColor | 3dColorTexture | 4dColorTexture
2d             <-- Wert Wert
3d             <-- Wert Wert Wert
3dColor        <-- Wert Wert Wert color
3dColorTexture <-- Wert Wert Wert color tex
4dColorTexture <-- Wert Wert Wert Wert color tex
color          <-- rgba | index
rgba           <-- Wert Wert Wert Wert
index          <-- Wert
tex            <-- Wert Wert Wert Wert 

Der Parameter Wert ist eine Fließkommazahl, und n ist ein Fließkommawert (der allerdings nur Ganzzahlwerte enthält) der die Zahl der Eckpunkte des Polygons angibt. GL_POINT_TOKEN, GL_LINE_TOKEN, GL_LINE_RESET_TOKEN, GL_POLYGON_TOKEN, GL_BITMAP_TOKEN, GL_DRAW_PIXEL_TOKEN, GL_COPY_PIXEL_TOKEN und GL_PASS_THROUGH_TOKEN sind symbolische Fließkommakonstanten. GL_LINE_RESET_TOKEN wird zurückgeliefert, sobald das Muster für die Linienmusterung zurückgesetzt wird. Die als Eckpunkte zurückgegebenen Daten hängen vom Feedbacktyp ab.

Die folgende Tabelle gibt eine Übersicht der Typen und der Anzahl von Werten die pro Vertex in den Feedbackpuffer geschrieben werden.
(k ist 1 im Farbindexmodus und 4 im RGBA-Modus.)

Type Koordinaten Farbe Textur Werte insgesamt
GL_2D x, y 2
GL_3D x, y, z 3
GL_3D_COLOR x, y, z k 3 + k
GL_3D_COLOR_Texture x, y, z k 4 7 + k
GL_4D_COLOR_Texture x, y, z, w k 4 8 + k

Eckpunkt-Koordinaten im Feeebackmodus werden als Fensterkoordinaten zurückgegeben, ausgenommen der w-Komponente, die in Clip-Koordinaten zurückgegeben wird. Farbwerte im Feedbackpuffer werden beleuchtet, sofern Beleuchtung aktiv ist. Texturkoordinaten im Feedbackmodus werden generiert, wenn Texturkoordinatengenerierung aktiv ist. Sie werden ausserdem immer durch die Texturmatrix transformiert.



Hinweise

Die glFeedBackBuffer-Funktion wird NICHT in eine Displayliste kompiliert wenn sie dort aufgerufen wird, sondern dann direkt ausgeführt.


Fehlermeldungen

GL_INVALID_ENUM wird generiert, wenn type ein ungültiger Wert übergeben wird.

GL_INVALID_VALUE wird generiert, wenn size ein negativer Wert übergeben wird.

GL_INVALID_OPERATION wird generiert, wenn der Rendermodus bereits GL_FEEDBACK ist und glFeedbackBuffer aufgerufen wird oder wenn glRenderMode mit dem Argument GL_FEEDBACK aufgerufen wird, bevor glFeedbackBuffer nicht mindestens einmal aufgerufen wurde.

GL_INVALID_OPERATION wird generiert, wenn glFeedbackBuffer innerhalb eines glBegin-glEnd-Blocks aufgerufen wird.


Zugehörige Wertrückgaben

glGet mit Token GL_RENDER_MODE


Siehe auch

glBegin, glLineStipple, glPassThrough, glPolygonMode, glRenderMode, glSelectBuffer