glPointSize: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (GlPointSize wurde nach glPointSize verschoben)
K (Kategorisierung)
 
(8 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
= glPointSize =
 
= glPointSize =
  
<br>
+
 
 +
 
 
== Name ==
 
== Name ==
 
'''glPointSize''' - legt den Durchmesser von Punkten fest.
 
'''glPointSize''' - legt den Durchmesser von Punkten fest.
  
<br>
+
 
 +
 
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
Syntax der Funktion (bitte an die dglOpenGL.pas halten), vorerst auch '''nur''' Delphi-Syntax. Bitte haltet euch dabei an folgende Vorgabe, die der Formatierung der glMan-Pages entspricht, und die für das Wiki wichtigen Teile der Syntax hervorhebt :
 
  
 
  procedure '''glPointSize'''(''size'' : GLfloat);
 
  procedure '''glPointSize'''(''size'' : GLfloat);
 
 
<br>
 
  
 
== Parameter ==
 
== Parameter ==
Zeile 18: Zeile 16:
 
{| border="1" rules="all"
 
{| border="1" rules="all"
 
! ''size''  
 
! ''size''  
| Bestimmt die Größe der gerasterten Punkte. Der '''Vorgabewert ist 1.0'''.
+
| Bestimmt die Größe der gerasterten Punkte. Der Vorgabewert ist 1.0.
 
|}
 
|}
  
<br>
+
 
 +
 
  
 
== Beschreibung ==  
 
== Beschreibung ==  
Mit glPointSize wird der Durchmesser in Pixeln von '''''aliased''''' und '''''antialiased''''' Punkten festgelegt. Zeichnen mit von 1 unterschiedlichen Punktgrössen hat je nachdem ob Punkt-Antialiasing aktiviert ist verschiedene Effekte.
+
Mit '''glPointSize''' wird der Durchmesser in Pixeln von '''''aliased''''' und '''''antialiased''''' Punkten festgelegt. Zeichnen mit von 1 unterschiedlichen Punktgrössen hat je nachdem, ob Punkt-Antialiasing aktiviert ist, verschiedene Effekte.
 
Punkt-Antialiasing wird mit [[glEnable]] bzw. [[glDisable]] und dem Argument [[glEnable#GL_POINT_SMOOTH|GL_POINT_SMOOTH]] an- bzw. ausgeschaltet.
 
Punkt-Antialiasing wird mit [[glEnable]] bzw. [[glDisable]] und dem Argument [[glEnable#GL_POINT_SMOOTH|GL_POINT_SMOOTH]] an- bzw. ausgeschaltet.
  
Zeile 51: Zeile 50:
 
== Beispiel ==
 
== Beispiel ==
  
Eine Kugel im Polygon Modus '''GL_POINTS''' mit  
+
Eine Kugel im [[glPolygonMode|Polygon Modus]] '''GL_POINTS''' mit  
  
 
{| border="1" rules="all"
 
{| border="1" rules="all"
Zeile 61: Zeile 60:
 
|}
 
|}
  
<br>
+
== Änderungen ==
 +
Folgende Erweiterungen hat die Funktion erfahren:
 +
=== Ab OpenGL-Version 1.4 ===
 +
Vor dem Aliasing bzw. vor dem Schritt '''Ohne Anti-Aliasing''' (siehe oben) werden noch weitere Operationen an einem Punkt ausgeführt : die gewünschte Punktgrösse (''size'') wird mit dem Abstands-Attenuation-Faktor multipliziert, auf einen mit [[glPointParameter]] definierten Punktgrössen-Bereich gemappt und weiterhin auf den implementationsabhängigen Punktgrössen-Bereich gemappt, um die abgeleitete Punktgrösse (''derived_size'') zu erzeugen :
 +
 
 +
[[Bild:Point_derivedsize_formel.png]]
 +
 
 +
wobei d der [[Augenkoordinaten]]-Abstand vom Auge (0; 0; 0; 1) in Augenkoordinaten zum Vertex und a, b, c Abstands-Attenuation-Funktionskoeffizienten sind. Wenn [[Multisampling]] nicht aktiviert ist, wird die abgeleitete Grösse an die [[Rasterung]] als Punktbreite weitergereicht. Falls Multisampling aktiviert ist kann die jeweilige OpenGL-Implementation (muss aber nicht) den Alphawert des Punktes abblenden anstatt es zuzulassen, dass die Punktbreite unter einen gegebenen Schwellwert (''threshold'') sinkt. In diesem Fall ist die Breite (''width'') des gerasterten Punktes:
 +
 
 +
[[Bild:Point_width_formel.png]]
 +
 
 +
und der Abblendfaktor ''fade'' wie folgt berechnet :
 +
 
 +
[[Bild:Point_fade_formel.png]]
 +
 
 +
Die Abstands-Attenuation-Funktionskoeffizienten a, b und c, die Grenzen des ersten Punktgrössenbereichs und die Punktabblendschwelle werden mit [[glPointParameter]] festgelegt.
 +
 
 +
=== Ab OpenGL-Version 2.0 ===
 +
Falls [[Multisampling]] nicht eingeschalten ist, aber ein [[Vertex-Shader]] aktiv und der Punktgrössenmodus des [[Vertex-Programm|Vertexprogramms]] aktiviert ist, wird die abgeleitete Punktgrösse über die (möglicherweise beschnittenen) builtin-Variablen des Shaders, [[gl_PointSize]], bezogen und auf den implementationsabhängigen Punktgrössenbereich gemappt. Falls der in gl_PointSize geschriebene Wert kleiner oder gleich 0 ist, sind die Ergebnisse undefiniert. Falls ein Vertex-Shader aktiv und der Punktgrössenmodus des Vertex-Programms deaktivert ist, wird die abgeleitete Punktgrösse vom Punktgrössenzustand genommen, der durch den Befehl '''glPointSize''' definiert wird. In diesem Falle wird keine Abstands-Attenuation ausgeführt. Der Punktgrössenmodus des Vertex-Programms wird durch den Aufruf von [[glEnable]] oder [[glDisable]] mit dem symbolischen Wert '''GL_VERTEX_PROGRAM_POINT_SIZE''' aktiviert bzw. deaktivert.
 +
 
 +
 
 +
 
 +
 
 +
 
 
== Fehlermeldungen ==
 
== Fehlermeldungen ==
'''GL_INVALID_VALUE''' wird generiert wenn ''size'' kleiner oder gleich 0 ist.<br>
+
'''GL_INVALID_VALUE''' wird generiert, wenn ''size'' kleiner oder gleich 0 ist.
'''GL_INVALID_OPERATION''' wird generiert wenn '''glPointSize''' innerhalb eines [[glBegin]]-[[glEnd]] Blocks aufgerufen wird.  
+
 
 +
'''GL_INVALID_OPERATION''' wird generiert, wenn '''glPointSize''' innerhalb eines [[glBegin]]-[[glEnd]]-Blocks aufgerufen wird.  
 +
 
  
<br>
 
  
 
==  Zugehörige Wertrückgaben ==
 
==  Zugehörige Wertrückgaben ==
[[glGet]] mit Token [[glGet#GL_POINT_SIZE|GL_POINT_SIZE]]<br>
+
[[glGet]] mit Token [[glGet#GL_POINT_SIZE|GL_POINT_SIZE]]
[[glGet]] mit Token [[glGet#GL_POINT_SIZE_RANGE|GL_POINT_SIZE_RANGE]]<br>
+
 
[[glGet]] mit Token [[glGet#GL_POINT_SIZE_GRANULARITY|GL_POINT_SIZE_GRANULARITY]]<br>
+
[[glGet]] mit Token [[glGet#GL_POINT_SIZE_RANGE|GL_POINT_SIZE_RANGE]]
 +
 
 +
[[glGet]] mit Token [[glGet#GL_POINT_SIZE_GRANULARITY|GL_POINT_SIZE_GRANULARITY]]
 +
 
 
[[glIsEnabled]] mit Token '''GL_POINT_SMOOTH'''
 
[[glIsEnabled]] mit Token '''GL_POINT_SMOOTH'''
  
  
<br>
+
 
 +
 
  
 
== Siehe auch ==
 
== Siehe auch ==
[[glEnable]] , [[glLineWidth]]
+
[[glEnable]] , [[glLineWidth]], [[OpenGL_Smooth]]
  
  
 
[[Kategorie:GL|PointSize]]
 
[[Kategorie:GL|PointSize]]
 +
[[Kategorie:GL1.0|PointSize]]

Aktuelle Version vom 25. Juli 2011, 09:42 Uhr

glPointSize

Name

glPointSize - legt den Durchmesser von Punkten fest.


Delphi-Spezifikation

procedure glPointSize(size : GLfloat);

Parameter

size Bestimmt die Größe der gerasterten Punkte. Der Vorgabewert ist 1.0.



Beschreibung

Mit glPointSize wird der Durchmesser in Pixeln von aliased und antialiased Punkten festgelegt. Zeichnen mit von 1 unterschiedlichen Punktgrössen hat je nachdem, ob Punkt-Antialiasing aktiviert ist, verschiedene Effekte. Punkt-Antialiasing wird mit glEnable bzw. glDisable und dem Argument GL_POINT_SMOOTH an- bzw. ausgeschaltet.


Ohne Anti-Aliasing Die tatsächliche Größe wird durch runden auf den nächsten Integer-Wert bestimmt (Werte < 0.5 werden auf 1 gerundet). Falls der gerundete Wert ungerade ist (n=2k+1), dann wird der Mittelpunkt (x,y) der PixelMenge wie folgt berechnet:

GlPointSize Mittelpunkt size ungerade.png

wobei w für Fenster-Koordinaten steht. Der Punkt besteht aus allen Pixeln, die innerhalb des Quadrats der festgelegten Grösse um den Mittelpunkt (x,y) liegen. Falls der gerundete Wert gerade ist (n=2k), berechnet sich der Mittelpunkt (x,y) wie folgt:

GlPointSize Mittelpunkt size gerade.png

Der Punkt besteht aus allen Pixeln, die innerhalb des Quadrats der festgelegten Grösse um den Mittelpunkt (x,y) liegen. Alle Pixel bekommen bei abgeschalteten Aliasing den selben Wert zugewiesen (Den des korrespondierenden Vertex).

Mit aktiviertem Antialiasing werden alle Pixel angeschaltet, die innerhalb des Kreises mit Durchmesser der aktuellen Punktgrösse um den Mittelpunkt (x(w), y(w)) liegen. Die Verdeckung für jedes Fragment wird durch die Fensterkoordinaten des Schnittpunktes mit dem entsprechenden Pixel berechnet. Jedes Fragment erhält die Daten des Punktes mit dem es gerendert wird.

Mit aktiviertem Antialiasing sind nicht alle Punktgrössen zulässig. Falls eine unzulässige Grösse angegeben wird, wird die nächste verfügbare Punktgrösse verwendet. Welche Grössen verwendbar sind ist abhängig von der Implementierung. Lediglich 1.0 ist als verwendbare Grösse vorgeschrieben. Die Spanne der verwendbaren Grössen und die Differenz zwischen den einzelnen Grössen kann mit glGet und den Konstanten GL_POINT_SIZE_RANGE und GL_POINT_SIZE_GRANULARITY abgefragt werden.

Mit GL_POINT_SIZE als Argument für glGet wird die durch glPointSize spezifizierte Punktgrösse abgefragt. Rundungen (bei aliased und antialiased Punkten) sowie Beschränkung auf zulässige Punktgrössen haben keinen Einfluss auf den Rückgabewert.

Die Grösse für Aliased-Punkt kann auf ein Implementationsspezifisches Maximum reduziert werden. Dieses kann nicht abgefragt werden, darf aber nicht kleiner sein als das auf den nächsten Integerwert gerundete Maximum für Antialiased-Punkte.

Beispiel

Eine Kugel im Polygon Modus GL_POINTS mit

glPointSize(1) glPointSize(5)
Glpointsize1.jpg Glpointsize5.jpg

Änderungen

Folgende Erweiterungen hat die Funktion erfahren:

Ab OpenGL-Version 1.4

Vor dem Aliasing bzw. vor dem Schritt Ohne Anti-Aliasing (siehe oben) werden noch weitere Operationen an einem Punkt ausgeführt : die gewünschte Punktgrösse (size) wird mit dem Abstands-Attenuation-Faktor multipliziert, auf einen mit glPointParameter definierten Punktgrössen-Bereich gemappt und weiterhin auf den implementationsabhängigen Punktgrössen-Bereich gemappt, um die abgeleitete Punktgrösse (derived_size) zu erzeugen :

Point derivedsize formel.png

wobei d der Augenkoordinaten-Abstand vom Auge (0; 0; 0; 1) in Augenkoordinaten zum Vertex und a, b, c Abstands-Attenuation-Funktionskoeffizienten sind. Wenn Multisampling nicht aktiviert ist, wird die abgeleitete Grösse an die Rasterung als Punktbreite weitergereicht. Falls Multisampling aktiviert ist kann die jeweilige OpenGL-Implementation (muss aber nicht) den Alphawert des Punktes abblenden anstatt es zuzulassen, dass die Punktbreite unter einen gegebenen Schwellwert (threshold) sinkt. In diesem Fall ist die Breite (width) des gerasterten Punktes:

Point width formel.png

und der Abblendfaktor fade wie folgt berechnet :

Point fade formel.png

Die Abstands-Attenuation-Funktionskoeffizienten a, b und c, die Grenzen des ersten Punktgrössenbereichs und die Punktabblendschwelle werden mit glPointParameter festgelegt.

Ab OpenGL-Version 2.0

Falls Multisampling nicht eingeschalten ist, aber ein Vertex-Shader aktiv und der Punktgrössenmodus des Vertexprogramms aktiviert ist, wird die abgeleitete Punktgrösse über die (möglicherweise beschnittenen) builtin-Variablen des Shaders, gl_PointSize, bezogen und auf den implementationsabhängigen Punktgrössenbereich gemappt. Falls der in gl_PointSize geschriebene Wert kleiner oder gleich 0 ist, sind die Ergebnisse undefiniert. Falls ein Vertex-Shader aktiv und der Punktgrössenmodus des Vertex-Programms deaktivert ist, wird die abgeleitete Punktgrösse vom Punktgrössenzustand genommen, der durch den Befehl glPointSize definiert wird. In diesem Falle wird keine Abstands-Attenuation ausgeführt. Der Punktgrössenmodus des Vertex-Programms wird durch den Aufruf von glEnable oder glDisable mit dem symbolischen Wert GL_VERTEX_PROGRAM_POINT_SIZE aktiviert bzw. deaktivert.



Fehlermeldungen

GL_INVALID_VALUE wird generiert, wenn size kleiner oder gleich 0 ist.

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


Zugehörige Wertrückgaben

glGet mit Token GL_POINT_SIZE

glGet mit Token GL_POINT_SIZE_RANGE

glGet mit Token GL_POINT_SIZE_GRANULARITY

glIsEnabled mit Token GL_POINT_SMOOTH



Siehe auch

glEnable , glLineWidth, OpenGL_Smooth