Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:03

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Programm Speed
BeitragVerfasst: Mo Jul 03, 2006 20:32 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

kennt von euch jemand die Rechenzeiten, die für die verschiedenen OpenGL Operationen benötigt werden?

Für mich gäbe das einen Entscheidungsmatrix, welche Befehle man oft verwenden kann und worauf man besser optimieren sollte. Auch wäre es interessant zu sehen, wieviel überhaupt welche optimierungen bringen würden - wenn etwas kaum verbesserungen bringt wäre unsinnig dort noch zu optinieren.

Interessant wären z.B. Zeiten für:

Statechanges: z.B. glEnable, glDisable (ohne den pos/neg. Auswirkungen der States - einfach durch unnötige/doppelte Aufrufe)
Matrix OPs: glMatrixMode, glMultMatrixf, glTranslatef, glRotatef
allgemein: glGetFloatv
Doppelte/Unnötige Aufrufe von: glNormal3f, clColor
...

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 03, 2006 22:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
hmmm ... schon wieder einer ... Such mal hier im Forum nach DGL Benchmark. Du bist im Grunde nicht allein mit dem Wunsch nach Detailwissen. Nur hat das noch niemand hier ausgiebig genug getestet.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 03, 2006 23:24 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Kann man auch nicht ausgiebig genug testen. Ist von Grafikkarte zu Grafikkarte, von Treiber zu Treiber und (wenn es nicht gerade um State-Changes geht) von Umgebung zu Umgebung unterschiedlich.

Es gibt diesbezüglich durchschnittliche Zahlen und das wars im allgemeinen Fall. Wenn du wirklich aufs extreme optimieren möchtest, so musst du Benchmarks auf der Platform laufen lassen auf der du optimieren möchtest.

Diesbezüglich ist auch ein Artikel recht interessant zum lesen: http://delphi3d.net/articles/viewarticle.php?article=stateman.htm

Und noch nebenbei bemerkt: für effizientes rendern solltest du nirgends ohne gute Gründe einen glNormal-Aufruf haben.

Generell kann man aber wahrscheinlich sagen: wenn du dir über die Anzahl der State Changes (und welche davon nötig sind) Sorgen machst, dann hast du höchst wahrscheinlich schon mehr daran gedacht als sehr viele andere.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 06:43 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Zitat:
Generell kann man aber wahrscheinlich sagen: wenn du dir über die Anzahl der State Changes (und welche davon nötig sind) Sorgen machst, dann hast du höchst wahrscheinlich schon mehr daran gedacht als sehr viele andere.

Oder gerade deswegen fing man erst an sich Sorgen zu machen ;) Also ich erinnere mich noch an die Zeiten an denen 50 Polygone einer Grafikkarte das Genick gebrochen haben. In aktuellen Projekten habe ich bislang noch nie geschafft die Rate unter 100 FPS zu bekommen, egal wie herzlos man mit den Ressourcen umgegangen ist (keine Sichtkontrollen, ständige Texturechanges). Führt man dann eine Sichtberechnung durch und sorgt dafür die glBindTexture zu minimieren, so fällt es mir sehr schwer zu glauben, dass ein glEnable(GL_DEPTH_TEST); überhaupt irgendwie lohnt noch berücksichtigt zu werden.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 11:01 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Danke erst mal für die Antworten.

Mein Projet muß unter Windows laufen, egal welche Hardware(also auf allen).
Demzufolge wird eine Hardware abhängige optimierung eher ausfallen.

In der Darstellung arbeite ich mit Smooth Schattierungen, und auch mit Vertexnormalen (darauf kann ich nicht verzichten - aber evtl. vermeiden die selbe normale nochmal zu zeichen). Dabei werden auch mehrere 100.000 (oder auch Millionen) Dreiecke dargestellt.
Also die fps bekomme ich locker runter - auch unter 1.
Ich will jetzt mal versuchen die Dreiecke in Strips zu packen, was aber aufgrund der verschiedene Vertexnomalen und Farben schwer fällt und evtl. nicht mehr so viel bringt.

Meine Hoffnung war unter neutralen Bdingungen (z.B: ohne HW Acceraration - nur mit Software OpenGL) schleifen (z.B. 100.000 mal den OpenGL Befehl auführen und dann rechenzeit ermitteln) zu rechen und dann einen Wert zu erhalten. Gibt es denn sowas schon?

Ansonten einfach eine Abschätzung was kostet viel Rechenzeit:
glNormal3f ?
clColor3f ?
GlEnable / GlDisable (z.B Clipplane0, DepthTest ...)

user69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 11:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Aber auch dann hängt es von der Implementation des Treibers an. Wieviele Takte hat den die CPU bzw. GPU usw. und wie werden Anweisungen umgewandelt für die Pipeline. Eine Aussage wie "Soll auf jedem Windows laufen" halte ich für sehr zweifelhaft und würde ich mir niemals in ein Pflichtenheft kommen lassen. Den wir Du feststellst 100.000 Polygone, dass ist keine Voodoo-Karte mehr, die das packen soll. Mehr Sinn macht es in der Regel eine technische Deadline zu ziehen (z.B. OpenGL-Version) und danach zu entscheiden, was man überhaupt verwenden kann. Ein Blick in die Preislisten offenbart, dass eine Geforce 5200 (128 MB RAM) für teilweise unter 33 € erhältlich ist. Schlägt man noch eine Generation darunter, so wird man sich realativ sicher sein können, dass selbst aktuelle Office-Rechner mit Oboard-Karten entsprechende Features unterstützen. (Zu lasten des RAMS versteht sich). Ich würde also meine technische Deadline min. irgendwo in dieser Region einsetzen und die Anwendung dafür entwickeln.

Bei der Optimierung kommt es dann darauf an, was sie darstellen soll. Wie gesagt, alles was die State-Machine verändert wird man vernachlässigen können. Interessant wird es stets dort, wo Du beginnst die Grafikkarte mit Informationen zu füttern (Geometriedaten, Texturen). Je weniger, je kleiner, desto weniger wird es fressen. Alle States, die sich massiv auf die Rechenleistung auswirken sollten dabei deaktiviert sein (Blending, Lightning, Tiefenpuffer wohl eher nicht). Evtl. mit Weichen arbeiten um die Anzahl der Daten zu minimieren. Dann schnappst Du Dir in regelmäßigen Abständen deine Deadline und schaust, wie es dort läuft. Dort sollte es dann auch leicht sein zu ermitteln, welche Teile (nicht Funktionen) der Maschine das Genick bricht. Bei alten Karten ist dies meist wenn die Kamera sehr nah an eine Textur heran ging).

Aber eine Software die auf allen Windows-Systemen läuft UND 100.000 Polygone über den Jordan schickt, wird es so nicht geben und sollte ggf. dem Auftraggeber auch so erklärt werden. Insbesondere wenn die Investitionskosten so gering sind, wird man dafür auch Verständnis haben (weil 30€ ist nicht vergleichbar mit dem zeitlichen Aufwand für viele Weichen zur Optimierung). Dazu kommt, dass in spätestens zwei Jahren (vista sei dank) wohl sowieso fast nur noch DX9-Karten auf dem Markt wusseln ;)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 11:59 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Am besten wärs wahrscheinlich du schreibst dir deine eigenen Tests, ist eh schnell gemacht. Aber hier mal etwas ältere Test-Ergebnisse von mir (auf meinem System):

Sehr schnell:
MatrixMode

Ganz grob etwa doppelt so lange:
(zumindest einige) glEnable/Disable, hab nicht alle probiert

Ganz grob etwa 10-15 mal so lange wie MatrixMode:
Push/Popmatrix, Translatef, Loadidentity und Loadmatrix

Multmatrix is mit ~24 mal so lange dabei.

Rotatef war von den Funktionen die ich probiert habe mit 50-60 mal so lange ziemlicher Rekordhalter.


BindTexture war so im Bereich 5-10 mal so lange, kann aber sehr sehr stark abhängig sein von Textur-Art, Größe, liegt sie im Grafikkarten-RAM, ...

Das glNormal und glColor und so dürfte wohl ziemlich das schnellste von dem ganzen Zeug sein, dafür braucht man sie auch am häufigsten. Wie gesagt besser wäre ggf. ein Vertex-Buffer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 12:15 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hi,

danke erstmal an Lyr. Etwa solche Aussagen hatte mir erhofft. Vielleicht hat ja auch noch jemand soche Erkenntnisse.
Oder man muß doch mal ein Programm basteln (da ist wieder dieses Probelm, daß der Tag nur 24 Stunden hat ;-) ), daß genau das testet und in ein logfile schreibt. Dan kann man ja auch hier in dem Forum die verschiedene Hardware testen und vergleichen (z.B. in einer Übersicht).

Ich erwarte aber, daß wie Phobeus schon schrieb gerade doppelte glColor und glNormal aufrufe ne Mege Zeit Kosten.
Was bring den bessere Ergebnisse: Triangle Strips oder Vertex Buffer (under Berücksichtigung einer breiten Hardwarebasis)?

Phoebus:
Auf allen Windows laufen meint ich natürlich auf gängiger Hardware (so ab Geforce oder GF2) Davor sind diese Polygonmengen schon echt zu viel. Zum Glück können aber auch die on Board chips nun schon ein recht annehmbares OpenGl.

Noch ne Frage an Phobeus: Wie meinst du das?
>Dazu kommt, dass in spätestens zwei Jahren (vista sei dank) wohl sowieso fast nur noch DX9-Karten auf dem Markt wusseln
Können die dann kein OpenGl mehr oder OpenGl mehr perfekt? Wie steht es den um die OpenGl zukunft mit Vista?

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 12:48 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Jein. Der Grafikkarten-Markt ist ein Spielemarkt und dieser wird natürlich von DX dominiert, entsprechend sind die Marketing-Namen auch daran orientiert. Eine DX9-Karte ist also (IMAO) in NVIDIA-Rahmen >GeForce5. Also Karten, die mit Fragment und Vertex Shader umgehen können. Da Aeroglass vermutlich doch vom einen oder anderen "Gamer" verwendet wird, sollte man davon ausgehen, dass dieser Kartentypus bald Standard sein wird. (Bei den Lebenszyklen wahrscheinlich auch schon ohne Aeroglass *sg). Ergo, wenn Du heute beginnst eine Anwendung zu schreiben (z.B. ein Spiel) und Du würdest mit heutigen Minimum-Karten arbeiten, würdest Du in 2 Jahren übers Ziel hinaus schießen und Techniken verwenden, die aus moderner Sicht nicht effzient sind. War ein BSP-Tree früher wichtig um zu Berechnen welches Polygon überhaupt gezeichnet werden muss, würde eine solche Technik ein modernes System ausbremsen, dass ohne Probleme die volle Geometry in wenigen Takten durch die Pipeline pustet. Mehre Rendererpasses, weil man nur mit einer Texture-Unit auskommen wollte? Das wäre schade, da heutige Systeme mächtig davon profitieren würden. Am falschen Ende zu sparen kann dazu führen, dass alle Ergebnisse unterdurchschnittlich sind, selbst dort, wo eine wesentlich bessere Leistung möglich wäre. Der Versuch von MS OpenGL unter Vista einzuschränken wurde (sofern ich aktuell bin) durch heftigen Protest abgewendet. OpenGL wird immer ein Standard bleiben, da er in Industrie und Wissenschaft dominiert.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 15:37 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
Eine Sache die in meinen Tests auf einer 3D-Karte mit sooo nem Bart unglaubliche Geschwindigkeitsvorteile brachte, war die Befehle glMap2f und glEvalMesh2.

Die hohe Geschwindigkeit dieser Befehle liegt darun zugrunde, dass der Grafikkarte keine Tonnen von Vertex-Daten übergeben werden müssen, sondern das die Karte lediglich die "Eckpunkte" des zu zeichnenden Objektes bekommt und die zugehörigen Vertex-Punkte von der Karte selbst berechnet werden. Die Datenmenge die über den Bus geht sinkt also je nachdem dramatisch.

Außerdem hat die Sache noch einen anderen Vorteil: Da ich quasi das Objekt mathematisch beschreibe, kann ich der Grafikkarte sagen, mit wie vielen Quads das Objekt gezeichnet werde soll. Ich kann also über einen einzigen Parameter steuern, wie detailliert das Objekt ist, und so problemlos eine Funktion schreiben, die das Objekt je nach Distanz zur Kamera in den Details reduziert, ohne das der Betrachter davon etwas mitbekommt, was natürlich auch wieder viel Rechenleistung spart.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 04, 2006 23:34 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schön das du die Befehle ansprichst. Könntest du mal eine kleine Demo schreiben die ein <<beliebiges interessantes Objekt hier einsetzen>> mit diesen Befehlen und dem beschriebenen LOD rendert? Würde sicherlich im Wiki gern gesehen werden. Büdde :o

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 05, 2006 07:11 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
@Two: hast du auch ein glFlush dahinter gepackt, also bevor du die Zeit misst? Ist ja nicht so das Grafikkarte und CPU 100% synchron arbeiten. Kann mir nicht vorstellen dass glMap jetzt wirklich schneller ist als wenn du entsprechend viele statische 3eckerl zeichnest. Kommt natürlich auf die Zeichenmethode und viele andere Sachen drauf an aber so im Großen und Ganzen halt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 05, 2006 12:33 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
@all:
Hat nicht jemand mal interesse ein keines Projekt zu starten, daß genau diese Zeitmessungen macht. Das kann ja dann hier von der Community weitereintwickelt werden (ich habe zwar einiges mit OpenGl gemacht aber nicht mit den DGL Headern und Templates):

-OpenGl RC erzeugen mit Randbedingungen: Fixe Größe (Wählbar ob Software oder Hardware Beschelunigung, z.B. 800x600 alternativ wählbar Fullscreen; wählbere Farbauflösung: 32/24/16 bit, wählbare Depthbufferauflösung...) - d.h. Pixelfomat gezielt aussuchen
-Logfile erzeugen mit: Windows Version; Prozessor und Speed; Gafikdetails (Hersteller, Treiber, OpenGL Version.. was halt auszulesen geht), Kennwerten des Pixelformates
- Schleifen erzeugen, die verschieden OpenGL Befehle (z.B 1.000.000 mal) duchlaufen und dann die zeit nehmen (evtl den Overhead der Schleifenzeit abziehen) und dann auch loggt (inkl dem entsprechenden Befehl).

Das kann dann später noch beliebig ausgebaut werden (automatischer Ablauf, Extention, LOD, Strips, Vertexbuffer...). Ich denke hier finden sich sicher dann leute, die das mit Aufnhemen würden.

So könnten wir schell Ergebnisse von x usern bekommen und vergleichen was wann welche Zeit braucht.

User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 05, 2006 14:40 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
Lyr hat geschrieben:
@Two: hast du auch ein glFlush dahinter gepackt, also bevor du die Zeit misst?

Ich habe keine Zeit gemessen, ich hab nur festgestellt das das Zeichnen eines Meshes statt einem Vertexarray (mit prinzipiell gleichem Inhalt) die Framezahl verdreifacht hat. Da ich hier mit einer sehr alten AGP 1x Karte arbeite gehe ich mal davon aus, dass die Übertragung von ca. 40.000 Dreieck-Koordinaten halt so seine Zeit frisst. ;)

Ich kann leider nicht das ganze Programm posten, da es doch etwas zu lang ist (es beinhaltet fast alle Tutorials da es mein Testprogramm ist). Ich kann hier aber mal meine Routine posten, mit der ich bei einem Würfel eine Fläche in Abhängigkeit der Distanz zur Kamera in mehrere Einzelteile zerlege.
Die Idee war primär um die Lichtdarstellung auf einer Fläche zu verbessern, aber stellt man beispielsweise mit einer ähnlichen Methode eine Kugel dar, kann man damit auch prima die Anzahl der Dreicke im Bild reduzieren.

Ich empfehle sehr stark vor der Verwendung der Meshes sich mal das Kapitel in der Tutorial-Sektion durchzulesen und einen Blick in das Thema Bézier-Kurven zu werfen, ansonsten wird man sich wundern wie die Controlpoints eigentlich das Ergebnis produzieren.

Code:
  1. procedure T3DCube.AddQuad(v1, v2, v3, v4: TAffineVector);
  2. const
  3.   TEXTURE_POINTS: array[0..1] of array[0..1] of array[0..1] of TGLFloat =
  4.    (((1, 0), (0, 0)),
  5.     ((1, 1), (0, 1)));
  6. var
  7.   pieces: integer;
  8.   f, dist: Single;
  9.   controlpoints: array[0..1] of array[0..1] of TAffineVector;
  10.   normal: TAffineVector;
  11.   quadcenter: TVector;
  12.   lightEnabled: TGLBoolean;
  13. begin
  14.   // Hier wird ein Quad nach Kameradistanz ist in kleinere Teilquads aufgeteilt,
  15.   // um die Lichtverteilung besser aussehen zu lassen.
  16.  
  17.   // Das macht natürlich nur Sinn, wenn das Licht auch an ist
  18.   glGetBooleanv(GL_LIGHTING, @lightEnabled);
  19.   if (lightEnabled) then begin
  20.  
  21.     // Die Anzahl der Teilquads bestimmt sich nach der Größe des Quads. Hier
  22.     // geben wir vor das beispielsweise ein 1x1 Quad in 8 Teilquads zerlegt
  23.     // würde, wenn es direkt am Bildschirm kleben würde.
  24.     f := VectorDistance(v2, v1)*8;
  25.  
  26.     // Gibt es eine Betrachterposition?
  27.     if (Assigned(camera)) then begin
  28.  
  29.       // Ja, dann ermitteln wir zuerst den Quadmittelpunkt mittels VectorLerp
  30.       quadcenter := VectorMake(VectorLerp(v1, v3, 0.5));
  31.  
  32.       // Und berechnen die Distanz zwischen Kamera und Quadmitte
  33.       dist := VectorDistance(quadcenter, camera.position);
  34.  
  35.       if (dist >= 2) then  // Hier aufpassen, bei <1 gibts sonst unendlich Quads
  36.         f := f / dist;     // Anzahl der Quads je nach Distanz verringern                                          
  37.     end;
  38.  
  39.     pieces := Round(f);    // In so viele Einzelquads zerlegen wir den Quad
  40.     if (pieces < 1) then   // Mindestens aber in einen
  41.       pieces := 1;
  42.   end else                 // Kein Licht? Dann nur 1 Quad
  43.     pieces := 1;
  44.  
  45.   // Problem ist, dass die Evaluatoren die Flächen im Uhrzeigersinn zeichnen
  46.   // statt gegen wie es sein sollte. Damit CullFacing uns nicht die falschen
  47.   // Seiten entfernt, müssen hier die Flächen umgedreht werden. Die Normalen
  48.   // werden dann aber falsch rum berechnet, darum müssten diese hier auch nocht
  49.   // umgedreht werden.
  50.   // So stehen die Flächen in die richtige Richtung:
  51.   //   3-->4
  52.   //   |   |
  53.   //   2-->1
  54.  
  55.   // Weil die Mesh-Evaluatoren die Normalen an den Ecken "abrunden", setzen wir
  56.   // hier einmal die Flächennormale. Mehr brauchen wir für Quads ja nicht.
  57.   normal := CalcPlaneNormal(v1, v2, v3);
  58.   glNormal3fv(@normal);
  59.  
  60.   // Die Controlpoints für das Mesh sind die Quad-Eckdaten.
  61.   // Achtung: Die Punkte in der richtigen Reihenfolge übergeben!
  62.   controlpoints[0, 1] := v1;
  63.   controlpoints[0, 0] := v2;
  64.   controlpoints[1, 0] := v3;
  65.   controlpoints[1, 1] := v4;
  66.  
  67.   // Jetzt definieren wir den Quad anhand der Kontrollpunkte von oben:
  68.   glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 2, 0, 1, 3*2, 2, @controlpoints);
  69.  
  70. { // So könnte man dann die Normalen per Mesh berechnen lassen
  71.   // Achtung: Die Normalen werden für eine runde Flächen gebildet, auch wenn wir
  72.   // hier einen Quad haben, da Meshes eigentlich für runde Objekte gedacht sind!
  73.  
  74.   // Die Controlpoints für das Mesh sind die Quad-Eckdaten.
  75.   // Achtung: Die Punkte in der richtigen Reihenfolge übergeben!
  76.   controlpoints[0, 1] := v1;
  77.   controlpoints[0, 0] := v2;
  78.   controlpoints[1, 0] := v3;
  79.   controlpoints[1, 1] := v4;
  80.  
  81.   // Jetzt definieren wir die Normalen nach den Punkten oben:
  82.   glMap2f(GL_MAP2_NORMAL, 0, 1, 3, 2, 0, 1, 3*2, 2, @controlpoints);
  83. }
  84.  
  85.   // Da die Flächen verkehrt rum gezeichnet werden, müssen hier natürlich auch
  86.   // die Texturen gedreht werden. Die richtigen Koordinaten relativ zu den
  87.   // Flächen stehen in TEXTURE_POINTS.
  88.   glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 2*2, 2, @TEXTURE_POINTS);
  89.  
  90.   // Hier wird jetzt das oben definierte Quad in <pices> * <pieces> Einzelquads
  91.   // zerlegt. 0, 1 bedeutet dabei das die Fläche im Bereich von 0%-100%
  92.   // verwendet wird. Bei 0, 0.5 würde beispielsweise nur die linke bzw. untere
  93.   // Hälfte des Quads gezeichnet.
  94.   glMapGrid2f(pieces, 0, 1, pieces, 0, 1);
  95.  
  96.   // Alle Teile (also von 0 bis <pieces>) Zeichnen
  97.   glEvalMesh2(GL_FILL, 0, pieces, 0, pieces);
  98.  
  99.   // So viele Triangles wurden gerade gezeichnet
  100.   inc(trianglesCount, pieces*pieces*2);
  101. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 12, 2006 20:45 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

ich habe mal einen Speedtest programmiert:

Wenn jemand interesse hat dieses mit komplexeren Testcode zu vervollständigen , dann bei mir (oder hier im Tread)melden, wir können das Projekt ja dann ausbauen und ins wiki stellen.

Bis dann
User 69

Hier die Ergebnisse (Hardware Athlon 2.600 - GeForce4 MX Integrated):
- Jeweils 1.000.000 Loops - Bei Triangles 1.000.000 Dreiecke
SwapBuffers - nur ein einzelner Aufruf
(dieser Test ist derzeit nur simpel (einfache Schleifen - Keine Kombinationen))

Code:
  1.  
  2.  
  3. +++++ PixelFormat Init +++++
  4. PixelFormat: no Hardware Accelaration; DepthBits: 16; ColorBits: 32
  5. +++++ PixelFormat Init +++++
  6. ------------------
  7. OpenGL Extensions:  GL_WIN_swap_hint GL_EXT_bgra GL_EXT_paletted_texture
  8. ------------------
  9. OpenGL Renderer: GDI Generic
  10. OpenGL Version: 1.1.0
  11. OpenGL Vendor:  Microsoft Corporation
  12. -------------------
  13. Loop only: always 1000000 Loops-------------------------------   0,000 sec
  14. glColor4d-----------------------------------------------------   0,062 sec
  15. glColor4f-----------------------------------------------------   0,063 sec
  16. glColor3f-----------------------------------------------------   0,047 sec
  17. glEnable(GL_CULL_FACE)----------------------------------------   0,047 sec
  18. glDisable(GL_CULL_FACE)---------------------------------------   0,031 sec
  19. glEnable(GL_LIGHTING)-----------------------------------------   0,062 sec
  20. glDisable(GL_LIGHTING)----------------------------------------   0,032 sec
  21. glEnable+glDisable(GL_LIGHTING)-------------------------------   0,140 sec
  22. glEnable(GL_CLIP_PLANE0)--------------------------------------   0,031 sec
  23. glDisable(GL_CLIP_PLANE0)-------------------------------------   0,047 sec
  24. glEnable+glDisable(GL_CLIP_PLANE0)----------------------------   0,094 sec
  25. glTranslatef--------------------------------------------------   0,094 sec
  26. glRotatef-----------------------------------------------------   0,578 sec
  27. glMatrixMode(GL_PROJECTION)-glMatrixMode(GL_MODELVIEW)--------   0,047 sec
  28. glLoadIdentity------------------------------------------------   0,094 sec
  29. glMultMatrixf(@Matrix_3DView)---------------------------------   0,390 sec
  30. glGetFloatv(GL_MODELVIEW_MATRIX, @RotMatrix)------------------   0,375 sec
  31. glNormal3fv(@DrawNormal)--------------------------------------   0,047 sec
  32. glNormal3f(0.0, 0.0, 1.0)-------------------------------------   0,031 sec
  33. glVertex3fv(@DrawVertex)--------------------------------------   0,219 sec
  34. glVertex3f(1.0, 1.0, 1.0)-------------------------------------   0,203 sec
  35. glNormal3f(0.0, 0.0, 1.0) + glVertex3f(1.0, 1.0, 1.0)---------   0,219 sec
  36. SwapBuffers (only once)---------------------------------------   0,000 sec
  37.  
  38.  
  39. +++++ PixelFormat Init +++++
  40. PixelFormat: Hardware Accelaration; DepthBits: 16; ColorBits: 32
  41. +++++ PixelFormat Init +++++
  42. ------------------
  43. OpenGL Extensions:  GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_transpose_matrix GL_ARB_vertex_program GL_ARB_window_pos GL_S3_s3tc GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_clip_volume_hint GL_EXT_compiled_vertex_array GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_multi_draw_arrays GL_EXT_packed_pixels GL_EXT_paletted_texture GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shared_texture_palette GL_EXT_stencil_wrap GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_object GL_EXT_vertex_array GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL_NV_blend_square GL_NV_fence GL_NV_fog_distance GL_NV_light_max_exponent GL_NV_packed_depth_stencil GL_NV_pixel_data_range GL_NV_point_sprite GL_NV_register_combiners GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_NV_texture_rectangle GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_NV_vertex_program1_1 GL_NVX_ycrcb GL_SGIS_generate_mipmap GL_SGIS_multitexture GL_SGIS_texture_lod GL_WIN_swap_hint WGL_EXT_swap_control
  44. ------------------
  45. OpenGL Renderer: GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
  46. OpenGL Version: 1.4.0
  47. OpenGL Vendor:  NVIDIA Corporation
  48. -------------------
  49. Loop only: always 1000000 Loops-------------------------------   0,000 sec
  50. glColor4d-----------------------------------------------------   0,047 sec
  51. glColor4f-----------------------------------------------------   0,016 sec
  52. glColor3f-----------------------------------------------------   0,031 sec
  53. glEnable(GL_CULL_FACE)----------------------------------------   0,016 sec
  54. glDisable(GL_CULL_FACE)---------------------------------------   0,015 sec
  55. glEnable(GL_LIGHTING)-----------------------------------------   0,032 sec
  56. glDisable(GL_LIGHTING)----------------------------------------   0,047 sec
  57. glEnable+glDisable(GL_LIGHTING)-------------------------------   0,171 sec
  58. glEnable(GL_CLIP_PLANE0)--------------------------------------   0,032 sec
  59. glDisable(GL_CLIP_PLANE0)-------------------------------------   0,015 sec
  60. glEnable+glDisable(GL_CLIP_PLANE0)----------------------------   0,078 sec
  61. glTranslatef--------------------------------------------------   0,063 sec
  62. glRotatef-----------------------------------------------------   0,297 sec
  63. glMatrixMode(GL_PROJECTION)-glMatrixMode(GL_MODELVIEW)--------   0,031 sec
  64. glLoadIdentity------------------------------------------------   0,063 sec
  65. glMultMatrixf(@Matrix_3DView)---------------------------------   0,140 sec
  66. glGetFloatv(GL_MODELVIEW_MATRIX, @RotMatrix)------------------   0,094 sec
  67. glNormal3fv(@DrawNormal)--------------------------------------   0,016 sec
  68. glNormal3f(0.0, 0.0, 1.0)-------------------------------------   0,015 sec
  69. glVertex3fv(@DrawVertex)--------------------------------------   0,328 sec
  70. glVertex3f(1.0, 1.0, 1.0)-------------------------------------   0,328 sec
  71. glNormal3f(0.0, 0.0, 1.0) + glVertex3f(1.0, 1.0, 1.0)---------   0,344 sec
  72. SwapBuffers (only once)---------------------------------------   0,016 sec
  73.  


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]