Mir ist gerade etwas sehr interessantes aufgefallen: Wenn ich ein von mir geladenes Mesh (ich versuche gerade die Grundzüge eines Loaders für das LDRAW-Format -> http://www.ldraw.org/ auf die Beine zu stellen) mitels glColor3f einfärbe, geht die Framerate im Vergleich zur "farblosen" Variante um 150 bis 200 FPS zurück Woran kann das liegen??? Damit hätte ich wirklich nicht gerechnet...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
nun, der verlust ist wirklich ein wenig hoch - eventuell rufst du glColor einfach zu oft auf, obwohl es gar nicht nötig ist, die farbe also schon nach wunsch gesetzt ist?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Guck dir mal die OpenGL Errors an. Eventuell taucht irgendwo ein Fehler auf der die GL ausbremst. (glGetError und gluErrorString)
Displaylisten an sich sollten ja eher keine probleme mit glColorf3f haben. Das wird ja mit einkompiliert.Hast du noch mehr als nur glColor eingefügt? Matrix-Operationen sind z.B. nicht ganz so performanzgünstig.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Ich hab jetzt mal einen Performancegewinn erzielt... Ic hab in der Tat glColor zu oft aufgerufen, weil das Dateiformat, das ich verwende Zeilenweise arbeitet. In jeder Zeile wird ein Dreieck, Viereck, usw beschrieben, das auch ein Farbattribut besitzt. Ich hab den Fehler begangen und hab die Zeile gelesen, die Farbe mit glColor gesetzt, das Dreieck gezeichnet und den selben Spass mit jeder weiteren Zeile wiederholt. Jetzt verwende ich glColor nur noch, wenn die Farbe geändert wird und habe dadurch ca. 370 FPS. Aber auch das erscheint mir noch immer seltsam im Vergleich zur Version ohne Farbe, wo ich gut 480 FPS erreiche.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wie wäre es denn, wenn du uns einmal ein bisschen Quellcode gönnst und evtl wäre der Name deine Grafikkarte auch nicht so verkehrt? So aus dem reinen Erzählen deiner Seits können wir nur schlecht erraten was genau bei dir das Problem ist.
Sind in dem Format Dreiecke und Vierecke nach Lust und Laune vermischt? Machst du für jede Zeile ein glBegin und ein glEnd?
Ich hab eine Radeon 9600 und im Moment verwende ich nur Dreiecke. Ich schalte am Anfang mit glBegin(GL_TRIANGLES) die Dreiecke ein und hangle mich dann mit einer for-Schleife durch die Datei.
Aber sehts euch selbst an:
Code:
unit DATLoader;
interface
uses Classes, dglOpenGL, SysUtils;
type
TDATTriangle =record
color,
x1, y1, z1,
x2, y2, z2,
x3, y3, z3 :integer;
end;
T3DVector =record
x, y, z :double;
end;
TDATLoader =class
private
Data : TStrings;
DspList : Gluint;
Color :Integer;
function BuildDATTriangle(Line :String): TDATTriangle;
function CalcNormalVector(Triangle : TDATTriangle): T3DVector;
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also so weit sieht das für ganz gut aus und eine Radeon 9600 sollte mit glColor wahrlich keine Probleme haben.
Das hat zwar höchstwahrscheinlich nichts mit dem Farbproblem zu tun aber ich weiß auch nicht ob das zu Problemen führen kann. Kann es sein, dass dein Model wahnsinnig groß ist? Und zwar lädst du deine Koordinaten in einen Integer und übergibst diese dann als Single. Delphi Konvertiert das für dich und OpenGL bekommt davon nichts mit. Aber um eine genügend große Auflösung mit einem Integer hinzubekommen müssen dessen Werte schon richtig groß sein. Also so im 1000 - 10000 Bereich minimum. Denke ich mal. Ich habe so etwas noch nicht ausprobiert. Aber evtl. probierst du es mal in dem du das Model nicht ganz so groß lädst. Also anstelle deiner Integer X, Y und Z benutzt singles. Beim Laden teilst du diese dann erst einmal durch einen hardcodierten Wert. Je nachdem wie groß das Model ist. Kann ich ja so nicht genau sagen.
In etwa so
Code:
Result.x1:=strtoint(copy(Line,1,index-1))/1000;
Vielleicht hat das ja einen Effekt auf das Gezeichnete. Vielleicht aber auch nicht. Kann ich so nicht sagen. Ist nur an dem Haarem herbei gezogen. Aber ein Versuch schadet nicht. Denke ich mal.
So, ich hab mal die Integer auf Single geändert.
Zu deinen Vermutungen: Ja, das Model ist sehr groß (aber sehr polygonarm), wird aber mit glScalef auf die nötige Größe geschrumpft. Ich hab aber mal das glScalef rauskommentiert und deinen Ansatz mit dem hardgecodeten Faktor probiert - mit dem Effekt das sich die Framerate nicht geändert hat. Ich bekomme aber langsam den Verdacht das es sich um ein Füllratenproblem handelt, denn wenn ich das Modell rotieren lasse ist die Framerate immer dann am niedrigsten, wenn man es direkt von vorne oder hinten sieht. Ich werd mir wohl mal Backfaceculling ansehen...
Jep, is scho seltsam... Aber kurz etwas andres: Sobald ich Licht aktiviere sieht alles -sehr- seltsam aus. Liegt das daran, dass das Modell aus relativ wenigen polygonen besteht?? Die Normalen dürften passen (Wie ich sie berechne steht im obigen Sourcecode). Smoothshading und GL_COLOR_MATERIAL sind an.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Nov 20, 2003 19:52 Beiträge: 48 Wohnort: Tillingen bei Chemnitz
Schau dir am besten mal die berechneten Normalen mit dem Debugger an. Sieht für mich so aus als würden die Normalen einmal 'richtigrum' und einmal 'falschrum' berechnet, also bei einem Dreieck zeigen sie nach außen und beim nächsten nach innen ins Auto.
_________________ ...die Idee ist gut, doch die Welt noch nicht bereit...
Registriert: Di Dez 02, 2003 12:47 Beiträge: 300 Wohnort: Marburg
Außerdem sieht man in den Farben auch nicht viel Variation (durchs Licht) eventuell haben die Normalen abgesehen von falscher Richtung auch falsche Längen (entweder bei der Übergabe auf die Länge 1 bringe oder zu begin
glEnable(GL_NORMALIZE);
aufrufen (kostet aber Performance))...
Kann natürlich sein, du weißt das schon längst
_________________ Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de
Die Normalen zeigen in die richtige Richtung, mit GL_NORMALIZE sieht das ganze aber trotzdem um Welten besser aus. Ich hab mir mal die Werte meiner normierten Vektoren angesehn und bemerkt das sie nicht normiert sind... Ich hab da ein paar selbst nachgerechnet und bin nicht auf den erwünschten Betrag von 1 gekommen...
edit: Haben doch den richtigen Betrag, hab nur nicht genau genug gerechnet. Also scheinen sie doch in die falsche Richtung zu zeigen. Wie bringe ich diese Vektoren in die richtige Richtung??
Wenn ich es richtig verstanden habe was falsch ist dann musst du die dinger umdrehen indem du die Vectoren anderst rum definierst.
_________________ Shareholder und Leitender Entwickler bei Pipedream-Games.
Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
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.