OpenGL-Buffer als Grundlage für Model-Rendering

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.

OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 11:02

Hi,

Also ich möchte performancemäßig gerne gleich das Optimum rausholen und wollte mich darüber erkundigen, ob das so geht:

Ich möchte halt einen VertexBuffer und einen IndexBuffer (kA, ob man das in OpenGL so nennt) verwenden. Wie das funktioniert, habe ich jetzt bereits rausgefunden. Ich würde beides auch auf der GPU speichern über diese OpenGL-Buffer-Extensions.

Zur Zeit mache ich es halt so, dass ich einen VertexBuffer, einen ColorBuffer und einen TextureCoordinatesBuffer verwende (und den IndexBuffer würd ich halt hinzufügen; und wo ich's gerade überlege, bräuchte ich ja auch nochn NormalBuffer oder so was) und alles über diese Buffer gewährleiste. Das alles zusammengepackt in einer Klasse würde ich später gerne als Basis für 3D-Models verwenden und beim Laden der Datei würde ich alles füllen.

Denkt ihr, diese zig Buffer, bald noch zusammen mit dem IndexBuffer stellen einen guten Ansatz dar oder gibt es hier irgendwelche Stolperfallen bzw. sollte ich diese Buffer (liegen ja auf der GPU, oder?) nicht mit Allem belasten, weil das zu viel ist. Wenn ich halt hunderte Models habe, könnte das problematisch werden. Ich hab ehrlich gesagt keine große Ahnung, wie man Modelle überhaupt puffern sollte. Mache ich das bei größeren Abschnitten einer riesigen Welt (ich denk immer viel weiter, als ich müsste) einfach über die Festplatte, sodass ich dann Modelle nachlade, oder sollte ich auch zwischen Heapspeicher und GPU-Speicher herumschieben?

Viele Fragen, vielleicht hat jemand viele Antworten oder einen coolen Link bzw. irgendeine Buchempfehlung (falls das halt unbedingt nötig ist, ich bin Anfänger).

Viele Grüße :)
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Ingrater » 07.02.2010, 11:27

Also man verwendet in der Regel für OpenGL VBO's (vertex buffer objects) dabei hat man in der Regel 2 Buffer einen Buffer mit den Vertexdaten und einen mit den Indizies. Die Daten sind in der Regel ineinander verschachtelt also z.b.

Position1-Farbe1-Texturekoordinaten1-Position2-Farbe2-Texturekoordinaten2-...

OpenGL bietet allerdings im Gegensatz zu DirectX auch die möglichkeit die daten Blockweise abzulegen

Position1-Position2-...-Farbe1-Farbe2-...-Texturkoordinate1-Texturkoordinate2-...

Damit können die Grafikkarten allerdings schlechter Umgehen, wenn man allerdings nur regelmäßig die Positionen verändern muss spart es Zeit und Aufwand.
Das einzige tutorial das ich dafür kenne ist das hier: http://nehe.gamedev.net/data/lessons/le ... ?lesson=45 allerdings ist hier schlecht das er mehere Datenbuffer anlegt anstatt einen großen zu verwenden. Aber es zeigt die Prinziepelle Nutzung der Extension. Pack besser die Daten in nur einen Buffer wie bei der 1. von mir beschrieben Methode. Hierzu brauchst du bei den Pointer calls den Stride parameter.

MFG Ingrater
Ingrater
 
Beiträge: 64
Registriert: 18.04.2007, 20:52

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 11:49

Ahh, verstehe. Okay, wenn das geht, ist das natürlich super. Dann werd ich später meine Buffer auch in einen großen switchen. :)

Das Problem daran ist halt ein wenig, dass ich dem Benutzer meiner Klasse überlassen wollte, was er alles verwendet. Wenn man z.B. die Color-Komponente nicht braucht, würde ich sie jetzt ja immer mitschleppen... Es sei denn, ich baue mir einen großen untypisierten Buffer und befülle den selbst irgendwie. Aber ich glaube, diese Option hat gar nicht so viele Vorteile, oder?

Ach und noch was fällt mir ein: Wir haben ja mehr Indices als Vertices. Dann wären ja ganz viele Index-Einträge unbesetzt, weil es mehr Vertices gibt. Also ist das schon ein viel größerer Speicheraufwand. Ist das vernachlässigbar?
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Ingrater » 07.02.2010, 12:39

Also nur die Daten kommen in einen großen Buffer. Für die Indcies musst du dann schon einen separaten Buffer anlegen.
Ich habe mir eine Vertexbuffer klasse geschrieben die mitgeteilt bekommt welche Daten alle gehalten werden sollen. Sie managed dann das intern und verteilt die Daten richtig auf den Buffer. Ich kann also auch z.b. die Farbe weglassen. Im Normalfall brauchst du dann später sowieso immer die gleichen Daten. Position, Texcoords, Normale und Tangente. Es ist dann praktisch auch egal wenn in dem Buffer mehr Daten drin sind als du wirklich benutzt. Nur falls du dann Platzprobelme auf dem Vram kriegst musst du dich um solche Probleme kümmern.
Ingrater
 
Beiträge: 64
Registriert: 18.04.2007, 20:52

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 13:06

Hi,

Okay, cool. Dann hätte ich noch eine (hoffentlich) letzte Frage :): Normalen haben wir doch auch nur je Fläche und nicht je Vertex. Also hätten wir hier doch wieder das gleiche Problem wie mit den Indizes, oder?
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Ingrater » 07.02.2010, 14:29

Naja man berechnet aus den Normalen pro Fläche die Normalen pro Vertex damit das gesamte Mesh rund und nicht Facetiert aussieht. Von daher hat man dann schon eine Normale pro Vertex. Aber das sollte im Normalfall das Meshloaderlib deiner Wahl tun (nimm Assimp ;-) )
Ingrater
 
Beiträge: 64
Registriert: 18.04.2007, 20:52

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 15:14

Hm, ja. Das ist jetzt ja eh doof, wenn wir z.B. 8 Vertices und 6 Flächen haben, dann habe ich ja pro Vertex ne Normale, die aber zu 2-3 Flächen gehört :(

(ASSIMP sieht super aus; ich werd erstmal versuchen, 3DS selbst zu laden, dann aber bestimmt das nochmal angucken)
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Krishty » 07.02.2010, 15:16

Ingrater hat geschrieben:OpenGL bietet allerdings im Gegensatz zu DirectX auch die möglichkeit die daten Blockweise abzulegen

Bietet D3D auch, aber man erzähtl sich, das sei <D3D10 haarstreubend weil nicht alle Treiber mit klarkommen.

Gruß, Ky
„All in all, I had a good life. What do you say the three of us grab a six-pack and watch the universe end?“
– „That's basically what I do every day!“


Kurzartikel – Hochwertiges Rendern von Sternen (mit Demo)
Benutzeravatar
Krishty
 
Beiträge: 1072
Registriert: 26.02.2009, 11:18

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Ingrater » 07.02.2010, 15:22

Naja so funktioniert das nicht. Du berechnest erst die Normalen pro Fläche. Dann suchst für jedes Vertex alle Flächen in denen es Vorkommt und deren Glättungsgruppe (Smoothinggroup) die gleiche ist. Die Normalen dieser Flächen addierst du dann auf und normalisierst sie danach wieder. Dann hast du die Normale für diesen Vertex. Kommt ein Vertex in mehreren Glättungsgruppen vor musst du ihn duplizieren, da ein Vertex nicht mehere Normalen haben kann. Allein schon aus dem Grund die Normalen selber berechnen zu müssen ist 3DS ein richtiger Mist zum selber laden. Ich hab das damals auch selber gemacht. Fürs Verständnis vielleicht ganz hilfreich, im Endeffekt schmeißt du den kompletten Code dann aber weg und nimmst doch eine fertige Bibliothek.

@Krishty
Ich meine mal von jemandem gehört zu haben, dass das in DX nicht geht, aber ich glaube dir natürlich ^^

Btw: Ich hab mal einen Test gemacht Vertexbuffer vs. Display Listen. Komischerweise waren die Displaylisten um einiges schneller. Die Nvidia treiber machen mit den Daten wohl iregndwelche Optimierungsmagie und kostenloses Frustrum-Culling kriegt man auch noch oben drauf.
Ingrater
 
Beiträge: 64
Registriert: 18.04.2007, 20:52

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 16:11

Displayliste sind das, wo man bei glDrawArrays/glDrawElements als letzten Parameter nicht ne 0 sondern die Vertices übergibt? ;P

Ich weiß auch nicht. Ich hab das in meinem Fall jetzt umswitchbar gemacht. Dadurch kann man das halt als Benutzer einfach ausprobieren und gut ist.

Das mit der Normalenberechnung macht natürlich Sinn und ja, das klingt scheiße. Und ja, ich mach das auch nur zu Übungszwecken. ^^ Aber eigentlich kann ich Parsen schon, vielleicht nehme ich dann tatsächlich Assimp dafür (wobei der Name gewagt gewählt ist).

PS: Mal ne ganz doofe Frage, aber wo auf der ASSIMP-Seite kann ich mir das Gerät runterladen? Bin ich zu blöd oder ist die Seite einfach grauenhaft strukturiert?
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Aramis » 07.02.2010, 16:35

PS: Mal ne ganz doofe Frage, aber wo auf der ASSIMP-Seite kann ich mir das Gerät runterladen? Bin ich zu blöd oder ist die Seite einfach grauenhaft strukturiert?


Danke. Hier der Link auf die grauenhaft strukturierte Seite.

Developers can and should* directly obtain ASSIMP's source code via SVN. For anonymous checkout use:
$ svn co https://assimp.svn.sourceforge.net/svnroot/assimp/trunk assimp


We try to provide both source code and precompiled binary packages for most platforms.
Download page
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 07.02.2010, 16:40

Das war eine Frage und keine Aussage, außerdem war ich ja offensichtlich zu blöd, was bedeutet, dass der zweite Teil der Frage getrost verneint werden kann. ;)

Danke!
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Ingrater » 07.02.2010, 17:45

Zum Thema Display Listen: http://www.lighthouse3d.com/opengl/disp ... dex.php3?1

Sollte man aber eher nicht mehr verwenden. Für quick & dirty allerdings extrem cool ^^
Ingrater
 
Beiträge: 64
Registriert: 18.04.2007, 20:52

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Eisflamme » 10.02.2010, 13:17

Mal unabhängig davon, dass ich den Link zum Download jetzt ja durch Dich habe... Aber wo auf assimp.sourceforge.net finde ich denn den Link dazu? Ich habe echt gesucht, aber hab den nicht gefunden.
Eisflamme
 
Beiträge: 117
Registriert: 26.05.2002, 16:42

Re: OpenGL-Buffer als Grundlage für Model-Rendering

Beitragvon Aramis » 10.02.2010, 13:46

Naja, im Reiter `Downloads´, dort dann unten -- unter den ganzen SVN/Mercurial-Links. Bislang bin ich noch nicht auf die Idee gekommen dass der Link zu übersehen sein kann .. allerdings gibt es schon einen Grund dafür dass er nicht gerade auf der Startseite in Schriftgröße 32 zu finden ist: Eigentlich ist es uns lieber wenn User den aktuellen SVN-HEAD auschecken und selber kompilieren.
Open Asset Import Library (Assimp) - Multiformat 3D Model-Importer
YIANG - Ein Jump'n'Run in ASCII-Grafik
Benutzeravatar
Aramis
Alexander Gessler
Moderator
 
Beiträge: 744
Registriert: 25.02.2009, 19:50
Wohnort: 2011
Benutzertext: Auch als Athos bekannt …

Nächste

Zurück zu Grafikprogrammierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste