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

Aktuelle Zeit: Di Jul 15, 2025 23:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Dez 06, 2010 11:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich stehe mal wieder vor einem Problem das ich mit dem IndexBuffer, bzw generell den VBOs habe.

Bisher hatte ich meine Mesh-Klasse so, das einfach für Vertex, Normal, UV etc jeweils ein Array da war, der ggf. mit einem Index Array indiziert wurde. Zusätzlich dann ein paar funktionen wie CalculateSmoothNormals, CalculateTangents etc. Alles soweit kein problem.

Jetzt brauche ich für ein neues Projekt ein paar funktionen wo es wichtig ist das ich ein Vertex welches von 8 Triangles benutzt wird auch wirklich nur einmal vorliegt und diese 8 Triangles sich dieses eben teilen. Das ist zwar in der Theorie via IndexBuffer möglich, hört aber schon beim Simplen Cube der Texturiert werden soll auf.

Ein einfacher Würfel besteht auch 8 Vertices die insgesamt 24x benutzt werden. Also im prinzip ein Vertexarray mit 8 einträgen und ein Index Array mit 24 einträgen.

Allerdings wenn man den gescheit Texturieren will muß ein Vertex mehr als eine UV Koordiante haben, jenachdem zu welchem Triangle sie gehört, sprich bei einem würfel wären das 14 UV Koordinaten.

Und da fängt das Problem an: Jetzt muß ich Vertices duplizieren damit ich ihnen verschiedene UV Koordinaten geben kann und habe somit 14 Vertices und 14 UVs und im Index Buffer immernoch 24 Einträge.

Aber jetzt sind halt 6 Vertices doppelt.


Für meine neuen Funktionen die ich brauche ist es aber zwingend notwendig das ich zumindest irgendwie, irgendwo die Information habe das diese 6 Vertices im gruned identisch zu einem gewissen anderen Vertex sind, sozusagen istanzen.


Mein aktueller plan sieht daher so aus das ich wenn ich in meiner Mesh Klasse sage "Schiebe Vertex 7 nach XZY" die klasse dann intern pro Vertex einen Array hat mit allen Indizes des OpenGL Buffers. Sprich wenn ich Vertex No. 7 verschiebe werden automatisch Vtx7 und Vtx13 im OpenGL Buffer verschoben.

Das funktioniert zwar, ist aber insofern extrem inperformant glaube ich, weil ich für JEDES Vertex einen Array habe.. und es wird natürlich viel viel öffter vorkommen das ein Vertex nicht mehrfach vorhanden ist und somit ein Array overhead ist.

Also schaut meine lösung jetzt so aus das ich zu jedem Vertex einen int-Index speichere der einfach auf den Index im OGL-Buffer zeigt und wenn dieser -1 ist alternativ ein Array benutzt wird.


Allerdings bin ich mir immernoch unsicher ob dies der perfekte, optimalste weg ist... Ich bin leider auch kein Fan davon zweigleisig zu fahren, also je nachdem die eine Mesh-Klasse oder die andere zu verwenden... Idealerweise würde ich gern eine haben die mir diese funktionalität bietet und trotzdem schnell und performant ist - wenn das denn möglich ist..

Hat jemand noch eine andere gute Idee zufällig?

Danke~
Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Dez 06, 2010 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du könntest intern ein Index-Array benutzen da einzeln auf die Vertex, Normal, UV Arrays referenziert. Also pro Vertex nicht nur einen Index, sondern eben pro Array ein Index. Das lässt sich aber so natürlich nicht rendern, d.h. du musst es wieder umwandeln bevor du renderst.

Eine alternative Möglichkeit wäre ein simulierter Indexbuffer im Vertexshader. Also du benutzt selbst definierte Vertexattribute und gibst so jedem Vertex NUR die benötigen Indices mit die sonst im Indexbuffer stehen würden. Mit Hilfe dieser Indices wird dann im Vertexshader die Position, Normale, UV usw. aus Float-Texturen geladen. Hilfreich ist hier wenn du TBOs benutzen kannst, dann hast du den ganzen Textur-Overhead nicht. TBOs brauchen dann Shader 4.0, ansonsten reicht Texturzugriff im Vertexshader was so etwa ab Shader 3.0 zu haben ist.

[Edit] Um sowas gescheit einzubinden brauchst du dann natürlich eine Shader-Klasse die "Libraries" erlaubt. Z.B. bei mir wird ein VirtualTexturing-Shader eingebunden, der dann nur noch so Aufgerufen wird:
Code:
vec4 virtualTexture2D(vec2 vtcoord);  // Forward-Deklaration: Sicherstellen das die Library geladen wurde

// ...

void main() {
   // ...

   gl_FragData[0] = virtualTexture2D(texcoord);
}

So würdest du das dann auch mit dem Indexbuffer-Shader machen, wobei die Library dann ein paar eigene globale Variablen im Vertexshader zur Verfügung stellt bzw. soweit möglich in die vordefinierten Varyings schreibt.
[/Edit]

Zitat:
Ich bin leider auch kein Fan davon zweigleisig zu fahren, also je nachdem die eine Mesh-Klasse oder die andere zu verwenden... Idealerweise würde ich gern eine haben die mir diese funktionalität bietet und trotzdem schnell und performant ist - wenn das denn möglich ist..

Also ich würde zweigleisig fahren. Eine Eier legende Wollmilchsau gibt es halt nicht. Ggf. gibst du aber beiden Mesh-Klassen eine gemeinsame Basisklasse, dann kannst du sie trotzdem gleich behandeln.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 11 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.

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