glPolygonStipple: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Kategorisierung)
 
(8 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 4: Zeile 4:
  
 
== Name ==
 
== Name ==
'''glPolygonStipple''' - Setzt das Muster mit dem Polygone getüpfelt werden.
+
'''glPolygonStipple''' - Setzt das Muster, mit dem Polygone getüpfelt werden.
  
  
Zeile 10: Zeile 10:
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
  
  procedure '''glPolygonStipple'''(const ''mask'' : PGLubyte;)
+
  procedure '''glPolygonStipple'''(const ''mask'' : PGLubyte);
  
  
Zeile 27: Zeile 27:
 
== Beschreibung ==  
 
== Beschreibung ==  
 
[[Bild:Polygon_stipple.jpg|thumb|200px|glPolygonStipple mit einem zufallsgenerieren Muster]]
 
[[Bild:Polygon_stipple.jpg|thumb|200px|glPolygonStipple mit einem zufallsgenerieren Muster]]
Das tüpfeln von Polygonen, ebenso wie bei Linien (siehe [[glLineStipple]]), deckte bestimmte Fragmente bei der Rasterung ab und erzeugt somit ein Muster. Das Tüpfeln ist hierbei abhängig vom [[Antialiasing]] des Polygons.
+
Das Tüpfeln von Polygonen, ebenso wie bei Linien (siehe [[glLineStipple]]), deckte bestimmte Fragmente bei der Rasterung ab und erzeugt somit ein Muster. Das Tüpfeln ist hierbei abhängig vom [[Antialiasing]] des Polygons.
  
 
Der Parameter '''''mask''''' ist ein Zeiger auf ein 32*32 großes Muster, welches so abgespeichert wurde wie ein solches für den Aufruf von [[glDrawPixels]] mit der Höhe und Breite von 32 , dem Pixel-Format GL_COLOR_INDEX und dem Datentyp GL_BITMAP(siehe [[glBitmap#Beispiel|Beispiel]] von [[glBitmap]]). Das heißt, dass das Muster als ein 32*32 großes Array von 1 Bit Farben Indexen angesehen wird, welches in (vorzeichenlose) Bytes gepackt wurde.
 
Der Parameter '''''mask''''' ist ein Zeiger auf ein 32*32 großes Muster, welches so abgespeichert wurde wie ein solches für den Aufruf von [[glDrawPixels]] mit der Höhe und Breite von 32 , dem Pixel-Format GL_COLOR_INDEX und dem Datentyp GL_BITMAP(siehe [[glBitmap#Beispiel|Beispiel]] von [[glBitmap]]). Das heißt, dass das Muster als ein 32*32 großes Array von 1 Bit Farben Indexen angesehen wird, welches in (vorzeichenlose) Bytes gepackt wurde.
Die Parameter von [[glPixelStore]] wie etwa GL_UNPACK_SWAP_BYTES und GL_UNPACK_LSB_FIRST, bestimmen die Verarbeitung der Bits zu dem Muster. Pixel Übertragungs(en: "pixel transfer") Operationen (etwa ''shift offset'' oder ''pixel map'') werden allerdings nicht auf das Muster angewant.
+
Die Parameter von [[glPixelStore]] wie etwa GL_UNPACK_SWAP_BYTES und GL_UNPACK_LSB_FIRST, bestimmen die Verarbeitung der Bits zu dem Muster. Pixel Übertragungs (en: "pixel transfer") Operationen (etwa ''shift offset'' oder ''pixel map'') werden allerdings nicht auf das Muster angewand.
  
Um das Tüpfeln von Polygonen zu aktivieren oder zu deaktivieren, rufe [[glEnable]] und [[glDisable]] mit dem Argument GL_POLYGON_STIPPLE auf. <br>
+
Um das Tüpfeln von Polygonen zu aktivieren oder zu deaktivieren, rufe [[glEnable]] und [[glDisable]] mit dem Argument GL_POLYGON_STIPPLE auf.
Das Tüpfeln von Polygonen ist beim Start deaktiviert.<br>
 
Wenn es aktiviert ist, wird ein rasterisiertes Fragment mit den Fensterkoordinaten xw und yw nur dann zur nächsten Stufe der Rendering Pipeline geschickt, wenn das ''(xw mod 32)te'' Bit in der ''(yw mod 32)sten'' Zeile des Tüpfelmusters '''1''' (eins/true) ist. When das Tüpfeln der Polygone deaktiviert ist, verhält sich die GL so als ob das Tüpfelmuster nur aus Einzen besteht.
 
  
 +
Das Tüpfeln von Polygonen ist beim Start deaktiviert.
  
 +
Wenn es aktiviert ist, wird ein rasterisiertes Fragment mit den Fensterkoordinaten xw und yw nur dann zur nächsten Stufe der [[Feste_Funktionspipeline#Fragment_Pipeline|Rendering Pipeline]] geschickt, wenn das ''(xw mod 32)te'' Bit in der ''(yw mod 32)sten'' Zeile des Tüpfelmusters '''1''' (eins/true) ist. Wenn das Tüpfeln der Polygone deaktiviert ist, verhält sich die OGL so als ob das Tüpfelmuster nur aus Einsen besteht.
 +
 +
==Hinweis==
 +
Das Muster welches durch '''glPolygonStipple''' erzeugt wird, ist "Screen Aligned". Das heißt, wenn Objekte rotieren oder bewegt werden, dann bewegt sich das Muster nicht mit, denn es ist nicht an die Objekte gebunden (wie z.B. eine [[Textur]]) sondern hängt quasi an der Zeichenfläche. Man kann das Verhalten vergleichen mit einem "Fliegengitter" welches über den Monitor gespannt wird.
 +
 +
== Beispiel ==
 +
Der Code zu dem obigen Würfel:
 +
<source lang="pascal">
 +
var
 +
  Arr: array [0..31, 0..3] of Byte;
 +
  X, Y, Bit: Integer;
 +
begin
 +
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 +
  glLoadIdentity;
 +
  glTranslatef(0, 0, -FZoom);
 +
  glRotatef(FRotationX, 1, 0, 0);
 +
  glRotatef(FRotationY, 0, 1, 0);
 +
 +
  FillMemory(@Arr[0, 0], 32*4, $00);
 +
 +
  for X := 0 to 31 do
 +
    for Y := 0 to 3 do
 +
      for Bit := 0 to 7 do
 +
        Arr[X, Y] := Arr[X, Y] or (Random(2) shl Bit);
 +
  glPolygonStipple(@Arr[0, 0]); // Übergabe des Arrays an OpenGL, dazu muss ein Pointer auf das allererste Element erstellt werden.
 +
 +
  glColor4f(1.0, 1.0, 1.0, 1.0);
 +
  glBegin(GL_QUADS);
 +
    // Bottom
 +
    glColor3f(0.0, 0.5, 0.0);
 +
    glVertex3f(-1.0, -1.0, -1.0);
 +
    glVertex3f(-1.0, -1.0, 1.0);
 +
    glVertex3f(1.0, -1.0, 1.0);
 +
    glVertex3f(1.0, -1.0, -1.0);
 +
 +
    // Top
 +
    glColor3f(0.5, 1.0, 0.5);
 +
    glVertex3f(-1.0, 1.0, -1.0);
 +
    glVertex3f(-1.0, 1.0, 1.0);
 +
    glVertex3f(1.0, 1.0, 1.0);
 +
    glVertex3f(1.0, 1.0, -1.0);
 +
 +
    // Left
 +
    glColor3f(0.5, 0.0, 0.0);
 +
    glVertex3f(-1.0, -1.0, -1.0);
 +
    glVertex3f(-1.0, -1.0, 1.0);
 +
    glVertex3f(-1.0, 1.0, 1.0);
 +
    glVertex3f(-1.0, 1.0, -1.0);
 +
 +
    // Right
 +
    glColor3f(1.0, 0.5, 0.5);
 +
    glVertex3f(1.0, -1.0, -1.0);
 +
    glVertex3f(1.0, -1.0, 1.0);
 +
    glVertex3f(1.0, 1.0, 1.0);
 +
    glVertex3f(1.0, 1.0, -1.0);
 +
   
 +
    // Back
 +
    glColor3f(0.0, 0.0, 0.5);
 +
    glVertex3f(-1.0, -1.0, -1.0);
 +
    glVertex3f(-1.0, 1.0, -1.0);
 +
    glVertex3f(1.0, 1.0, -1.0);
 +
    glVertex3f(1.0, -1.0, -1.0);
 +
   
 +
    // Front
 +
    glColor3f(0.5, 0.5, 1.0);
 +
    glVertex3f(-1.0, -1.0, 1.0);
 +
    glVertex3f(-1.0, 1.0, 1.0);
 +
    glVertex3f(1.0, 1.0, 1.0);
 +
    glVertex3f(1.0, -1.0, 1.0);
 +
 +
  glEnd;
 +
  SwapBuffers(FDeviceContext);
 +
end;
 +
</source>
  
  
 
== Fehlermeldungen ==
 
== Fehlermeldungen ==
'''GL_INVALID_OPERATION''' wird generiert wenn '''glPolygoneStipple''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.  
+
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glPolygoneStipple''' innerhalb eines [[glBegin]]-[[glEnd]]-Blocks aufgerufen wird.  
  
  
Zeile 46: Zeile 119:
  
 
==  Zugehörige Wertrückgaben ==
 
==  Zugehörige Wertrückgaben ==
[[glGetPolygonStipple]]<br>
+
[[glGetPolygonStipple]]
 +
 
 
[[glIsEnabled]] mit dem Token with argument [[glIsEnabled#GL_POLYGON_STIPPLE|GL_POLYGON_STIPPLE]]
 
[[glIsEnabled]] mit dem Token with argument [[glIsEnabled#GL_POLYGON_STIPPLE|GL_POLYGON_STIPPLE]]
<br>
+
 
 +
 
  
 
== Siehe auch ==
 
== Siehe auch ==
Zeile 54: Zeile 129:
  
 
[[Kategorie:GL|PolygonStipple]]
 
[[Kategorie:GL|PolygonStipple]]
 +
[[Kategorie:GL1.0|PolygonStipple]]

Aktuelle Version vom 25. Juli 2011, 11:27 Uhr

glPolygonStipple

Name

glPolygonStipple - Setzt das Muster, mit dem Polygone getüpfelt werden.


Delphi-Spezifikation

procedure glPolygonStipple(const mask : PGLubyte);



Parameter

mask Spezifiziert einen Zeiger auf einem 32x32 Tüpfel-Muster, dass im Speicher genauso abgelegt wird wie bei glDrawPixels.



Beschreibung

glPolygonStipple mit einem zufallsgenerieren Muster

Das Tüpfeln von Polygonen, ebenso wie bei Linien (siehe glLineStipple), deckte bestimmte Fragmente bei der Rasterung ab und erzeugt somit ein Muster. Das Tüpfeln ist hierbei abhängig vom Antialiasing des Polygons.

Der Parameter mask ist ein Zeiger auf ein 32*32 großes Muster, welches so abgespeichert wurde wie ein solches für den Aufruf von glDrawPixels mit der Höhe und Breite von 32 , dem Pixel-Format GL_COLOR_INDEX und dem Datentyp GL_BITMAP(siehe Beispiel von glBitmap). Das heißt, dass das Muster als ein 32*32 großes Array von 1 Bit Farben Indexen angesehen wird, welches in (vorzeichenlose) Bytes gepackt wurde. Die Parameter von glPixelStore wie etwa GL_UNPACK_SWAP_BYTES und GL_UNPACK_LSB_FIRST, bestimmen die Verarbeitung der Bits zu dem Muster. Pixel Übertragungs (en: "pixel transfer") Operationen (etwa shift offset oder pixel map) werden allerdings nicht auf das Muster angewand.

Um das Tüpfeln von Polygonen zu aktivieren oder zu deaktivieren, rufe glEnable und glDisable mit dem Argument GL_POLYGON_STIPPLE auf.

Das Tüpfeln von Polygonen ist beim Start deaktiviert.

Wenn es aktiviert ist, wird ein rasterisiertes Fragment mit den Fensterkoordinaten xw und yw nur dann zur nächsten Stufe der Rendering Pipeline geschickt, wenn das (xw mod 32)te Bit in der (yw mod 32)sten Zeile des Tüpfelmusters 1 (eins/true) ist. Wenn das Tüpfeln der Polygone deaktiviert ist, verhält sich die OGL so als ob das Tüpfelmuster nur aus Einsen besteht.

Hinweis

Das Muster welches durch glPolygonStipple erzeugt wird, ist "Screen Aligned". Das heißt, wenn Objekte rotieren oder bewegt werden, dann bewegt sich das Muster nicht mit, denn es ist nicht an die Objekte gebunden (wie z.B. eine Textur) sondern hängt quasi an der Zeichenfläche. Man kann das Verhalten vergleichen mit einem "Fliegengitter" welches über den Monitor gespannt wird.

Beispiel

Der Code zu dem obigen Würfel:

var
  Arr: array [0..31, 0..3] of Byte;
  X, Y, Bit: Integer;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;
  glTranslatef(0, 0, -FZoom);
  glRotatef(FRotationX, 1, 0, 0);
  glRotatef(FRotationY, 0, 1, 0);

  FillMemory(@Arr[0, 0], 32*4, $00);

  for X := 0 to 31 do
    for Y := 0 to 3 do
      for Bit := 0 to 7 do
        Arr[X, Y] := Arr[X, Y] or (Random(2) shl Bit);
  glPolygonStipple(@Arr[0, 0]); // Übergabe des Arrays an OpenGL, dazu muss ein Pointer auf das allererste Element erstellt werden.

  glColor4f(1.0, 1.0, 1.0, 1.0);
  glBegin(GL_QUADS);
    // Bottom
    glColor3f(0.0, 0.5, 0.0);
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f(-1.0, -1.0, 1.0);
    glVertex3f(1.0, -1.0, 1.0);
    glVertex3f(1.0, -1.0, -1.0);

    // Top
    glColor3f(0.5, 1.0, 0.5);
    glVertex3f(-1.0, 1.0, -1.0);
    glVertex3f(-1.0, 1.0, 1.0);
    glVertex3f(1.0, 1.0, 1.0);
    glVertex3f(1.0, 1.0, -1.0);

    // Left
    glColor3f(0.5, 0.0, 0.0);
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f(-1.0, -1.0, 1.0);
    glVertex3f(-1.0, 1.0, 1.0);
    glVertex3f(-1.0, 1.0, -1.0);

    // Right
    glColor3f(1.0, 0.5, 0.5);
    glVertex3f(1.0, -1.0, -1.0);
    glVertex3f(1.0, -1.0, 1.0);
    glVertex3f(1.0, 1.0, 1.0);
    glVertex3f(1.0, 1.0, -1.0);
    
    // Back
    glColor3f(0.0, 0.0, 0.5);
    glVertex3f(-1.0, -1.0, -1.0);
    glVertex3f(-1.0, 1.0, -1.0);
    glVertex3f(1.0, 1.0, -1.0);
    glVertex3f(1.0, -1.0, -1.0);
    
    // Front
    glColor3f(0.5, 0.5, 1.0);
    glVertex3f(-1.0, -1.0, 1.0);
    glVertex3f(-1.0, 1.0, 1.0);
    glVertex3f(1.0, 1.0, 1.0);
    glVertex3f(1.0, -1.0, 1.0);

  glEnd;
  SwapBuffers(FDeviceContext);
end;


Fehlermeldungen

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



Zugehörige Wertrückgaben

glGetPolygonStipple

glIsEnabled mit dem Token with argument GL_POLYGON_STIPPLE


Siehe auch

glDrawPixels, glLineStipple, glPixelStore, glPixelTransfer