Um Speicherplatz (bei x Mio Dreiecken) möchte ich die Vertexnormalen nicht als Vector3f sondern als Vector3b also als glNormal3b = 3x ShortInt (-128 bis 127) speichern und dann auch so Zeichnen.
Hat schon mal jemand damit gearbeitet und Efahrungen? Wenn Ja - welche? Sind ggf gößere Geschwindigkeitseinbußen zu befürchten? Könnte es evtl. auf manchen Grafikkarten (z.b. Auch auf einfachen SIS odder Inegrated on Board) zu Problemen führen? Reicht da ein mapping von -127 bis +127 aus? (da ja die maximalwerte (also -128 und +127) zu -1 oder +1 gemappt werden).
Da du glNormal3b erwähnst vermute ich das du den "Immediate Mode", also glBegin()...glEnd() verwendest. Wenn du bei "x Mio Dreiecken" wirklich Performance rausholen willst, solltest vielleicht auf VertexBufferObjects umsteigen. Dort hast du außerdem die volle Kontrolle darüber was im Speicher landet. Ich wäre mir nämlich nicht so sicher ob glNormal3b die Normale auch als ShortInt speichert, wäre möglich dass das einfach zum Float wird.
Das Mapping sollte allerdings automatisch korrekt sein.
Erst mal danke für die Kommentare. Hier ein paar ergänzungen dazu...
Ich nutze dafür glBegin()...glEnd(), das ist richtig. VBO habe ich derzeit nicht gaplant, da es nicht auf allen OpenGL implementationen verfügbar ist. Ich darf nur Features nutzen die alle "normalen" modernen Rechner (Grafikkarten unabhängig) zur Verfügung stellen.
Im Prinzip such ich auch nicht nach Performace, sondern möchte sicherstellen, daß bei der Änderungen von glNormal3f auf glNormal3b keine Performanceenbrüche auftreten.
Mein Ziel ist die speicherung der Daten in meinem Programm zu minimieren (unter Windows 32 Bit hab ich leider nur knapp 2 GB): glNormal3f benötigt 3*3*4 Byte = 36 Byte glNormal3b benötigt 3*3*1 Byte = 9 Byte Das spart mir im Speicher 27 Byte /Dreieck was ca 25% weniger Speichernutzung bring = Mein Ziel
Natülcih möchte ich dann aus Performancegründen diese Normale gleich als glNormal3b zeichnen und nicht wieder zu glNormal3f vor jedem zeichnen umrechnen.
Hast schon jemand Erfahrungen mit glNormal3b gemacht???
VBO habe ich derzeit nicht gaplant, da es nicht auf allen OpenGL implementationen verfügbar ist. Ich darf nur Features nutzen die alle "normalen" modernen Rechner (Grafikkarten unabhängig) zur Verfügung stellen.
Also VBO's sollte mittlerweile wirklich überall verfügbar sein. Sie sind Teil von OpenGL 1.5, also garantiert verfügbar, wenn OpenGL 1.5 verfügbar ist und das ist schon 6 Jahre alt. Und davor wahren sie schon als Extension verfügbar...ich behaupte mal wenn du einen Rechner mit 2 GB RAM brauchst, dann kannst du auch VBOs voraussetzen...
Zitat:
(unter Windows 32 Bit hab ich leider nur knapp 2 GB)
Ich weiß nicht was du da machst, aber 2 GB Geometriedaten sind eine Menge Holz! Gut das Betriebsystem braucht natürlich auch was, aber dir ist schon klar das die Geometrie entweder auf der Grafikkarte gespeichert (VBO, Displaylisten) werden muss oder in jedem Frame vom Hauptspeicher rüberkopiert (glBegin()...glEnd() oder VertexArrays) werden muss? Insbesondere bei älteren Grafikkarten mit AGP-Port ist die Verbindung zwischen Hauptspeicher und Grafikkarte der Flaschenhals. AGP 1x schafft gerade mal 266 Mb pro Sekunde. Allerdings passt in den Grafikspeicher natürlich auch nicht gerade viel, zumindest wenn du von älteren Karten ausgehst.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@user69: Willst du nur Speicher einsparen oder möchtest du die Performance steigern?
Wenn du viele Infos zeichnest sind Raumunterteilungstechniken (siehe Wiki) wirklich der größte Bringer, vor Allem wenn du dich IN der Szene befindest und nicht immer davor.
Alternativ kann dir LOD (Level Of Detail) helfen Datenmengen einzusparen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Also mit der Performance bin ich zufrieden. Ich zeichne mit Trianglestrips und einfach über glBegin und glEnd. 2-3 Mio Dreiecke gehen auf halbwegs modernen Rechner schon ganz gut.
Aber es kommt schon vor daß sehr große Datenmengen dergestellt werden sollen (Das will ich zumindest mit verminderter Performance) erlauben. Derzeit kann ich so etwa 12 Mio Dreiecke im Speicher halten. Mit der Änderung wären es ca. 25% mehr.
OpenGL 1.5 kann ich nicht nutzen, da ich im zweifelsfall mit der Softwareimplementierung von Microsoft leben muss, die 1.2 ist.
Es gäbe da auch noch Mesa als OpenGL-kompatible Bibliothek, mit der man im Notfall den nicht vorhandenen oder zu alten Hardware-Renderer ersetzen könnte. Nur so als Idee weil du schon den Microsoft-Software-Renderer im Kopf hast.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich muss da mal generell was zu OpenGL sagen. OpenGL ist erweiterungsbasiert und entsprechend werden bestehende Techniken mitunter verbessert etc. Was ich damit sagen will. Du kannst eine Kombination aus Vertex Array und Vertex Buffer Object benutzten. VBOs basieren auf VAs. Die sind sich also sehr sehr ähnlich. Nur mit dem Unterschied, dass bei VBOs die Daten vor dem Zeichnen zur Grafikkarte übertragen werden müssen und ein paar Befehle mehr aufgerufen werden müssen (inklusive Überprüfung Erweiterung/OpenGL Kern Version). Sonst sind sie identisch. VAs sind im übrigen so alt, dass die bereits in dem Software Renderer enthalten sind.
Warum ich das erwähne. Im Imediate Mode (glBegin/glEnd) hast du immer irgendwo eine Beschränkung der Leistung durch die CPU/Kleckerweise Datenübertragung vom RAM zur GPU. Ein VA würde dort unnötige Aufrufe schon mal elimenieren. Kann aber auch keine Wunder bewirken. Selbst Karten von vor 4-5 Jahren waren technisch in der Lage 200+ Millionen Dreiecke pro Sekunde zu zeichnen. Rein Praktisch ist man dort mit VBOs aber immerhin noch bei 20-60 Mio gelandet. Im Imediate Modus wird man so etwas nicht erreichen können.
Du hättest so mit vertretbarem Aufwand die Möglichkeit wirklich neue Hardware zu unterstützen bzw im Falle der nicht Unterstützung würdest du bis OpenGL 1.1 zurückfallen können. Von daher solltest du dich in keinem Fall gegen neuere Technologien entscheiden. Es ist dir überlassen ob du eine Erweiterung vorraussetzt oder ob du sie benutzt, wenn sie verfügbar ist. Das ist kein Muss.
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.