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

Aktuelle Zeit: Mo Dez 18, 2017 05:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zeichengeschwindigkeit
BeitragVerfasst: Do Nov 30, 2017 14:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Hallo,

ich versuche mich gerade an einem Labyrinthgenerator in dem man das erschaffende Labyrinth auch durchstreifen kann.
Das ganze ist Feld-basierend wie früher die alten Crawler ("Dungeon Master" oder "Eye of Beholder") allerdings mit weichen Bewegungen
also eher wie "Legend of Grimrock" oder "Might and Magic X". Das Labyrinth wird als 2D-Array erstellt, in jedem Feld steht dann
ob es ein Gang, offener Raum, T-Kreuzung,... ist. Die 3D Elemente sind modular aufgebaut und bestehen aus 2 bis 6 Mesh-Teilen.
Es gibt 7 Mesh-Teile. Später soll es mehrere Sätze solcher Mesh-Teile geben. Für mehr Abwechselung kann dann zufällig ein Satz
ausgewählt werden.
Derzeit zeichne ich für jedes Feld die Mesh-Teile mit glDrawArrays. Im Frustum sind etwas über 100 Felder macht also bis zu 700
glDrawArrays Aufrufe. Alle Mesh-Teile liegen zwar in einem VOB und haben auch nur einen Texturatlas so das die Wechselei dafür wegfällt
aber ich frage mich ob es nicht besser ist aus dem 2D-Array ein 3D-Model zu erstellen, das in einem VOB schieben und mit einem Aufruf
zeichnen zu lassen.

Des weiteren versuche ich die Mesh-Teile indiziert zu zeichnen mit glDrawRangeElements. Aber irgendwie schaffe ich es nicht Dreieck 7 bis 25
zeichnen zu lassen. da kommt immer nur Wirrwarr bei raus. Auch sind die Beschreibungen von glDrawRangeElements recht wirr.
Vielleicht kann da ja auch jemand helfen.

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: Do Nov 30, 2017 20:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1071
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wieso machst du es nicht einfach mit glDrawArrays ?
Code:
  1.   // Zeichne Quadrat
  2.   glBindVertexArray(VBQuad.VAO);
  3.   glUniform3f(Color_ID, 1.0, 0.0, 0.0);  // Farbe ändern
  4.   glDrawArrays(GL_TRIANGLES, 0, 3);      // zweites Polygon
  5.   glUniform3f(Color_ID, 1.0, 0.0, 1.0);  // Farbe ändern
  6.   glDrawArrays(GL_TRIANGLES, 3, 3);      // zweites Polygon
  7.  

Somit kannst du auch dein ganzes Labyrint als ganzes in VOB packen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: Fr Dez 01, 2017 08:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Zitat:
Derzeit zeichne ich für jedes Feld die Mesh-Teile mit glDrawArrays.


Mit glDrawRangeElements soll das ganze indiziert gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: Fr Dez 01, 2017 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 431
Programmiersprache: C / C++ / Lua
Klingt eher als willst du instancing machen.

Hau also alle Meshteile in ein VBO und ruf pro Meshteil einmal glDrawArraysInstanced auf. Die Positionen/Matrizen gibts du entweder als UBO oder Uniformarray fester laenge durch (falls legacy gl).

Indexed rendering ist bei sowas halt auch eher unnoetig. Falls du das doch unbedingt haben willst, musst du schon mehr code geben, damit man nachvollziehen kann, wo es kaputt ist. ^^

Aber bei so kleinen Groessen ist es halt auch unnoetig da zu optimieren - ich wuerde es einfach, wenn es funktioniert, erstmal so lassen. (bis du halt irgendwann in performance probleme tatsaechlich reinlaeufts) #prematureoptimization

_________________
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: Fr Dez 01, 2017 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1071
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Indexed rendering ist bei sowas halt auch eher unnoetig.

Dies habe ich auch gedacht, aus diesem Grund habe ich glDrawArrays( empfohlen.
Da es sich um ein eckiges Labyrinth handelt, macht es nach meiner Meinung keinen Sinn mit Indizien, besonders wen noch eine Beleuchtung ins Spiel kommen sollte, man will ja die Kanten des Labyrinths sehen.

Oder soll das Labyrinth als Drahtgitter dargestellt werden ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: So Dez 03, 2017 00:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Zitat:
Oder soll das Labyrinth als Drahtgitter dargestellt werden ?

Nein es hat eher etwas von einem alten Stollen oder Höhle.

Zitat:
Falls du das doch unbedingt haben willst, musst du schon mehr code geben, damit man nachvollziehen kann, wo es kaputt ist

Ich möchte z.B. die Indice 7 bis 12 im IBO darstellen aber es kommt immer ab Indice 0 bei glDrawRangeElements.
Ich werde nicht daraus schlau wie ich die Parameter einstellen muß.
Zitat:
glDrawRangeElements(mode, start, end, count, type, indices);
start Specifies the minimum array index contained in indices.

end Specifies the maximum array index contained in indices.

count Specifies the number of elements to be rendered.

indices Specifies a pointer to the location where the indices are stored.
Ich habe mit Start und End versucht den Bereich im IBO anzugeben der gezeichnet werden soll aber wozu dann Count und es hat auch nicht geklappt. Ich hatte auch den Indices pointer auf z.B. 7 gestellt ... aber es hat nicht geklappt. Ab Indice 0 da ist alles schön.
Ansonsten werde ich mir mal Instancing ansehen.

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: So Dez 03, 2017 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 531
Programmiersprache: C++
Zu glDrawRangeElements: Die Funktion verhält sich exakt wie glDrawElements. Der einzige Unterschied sind die zusätzlichen Parameter start und end. Damit gibst du NICHT den Bereich des IBO an, der gerendert werden soll. Du sagst OpenGL nur, dass alle Indizes im IBO, die du mit dem Funktionsaufruf renderst, einen Wert zwischen start und end haben. Das ermöglicht dem Treiber unter Umständen, etwas Cache-Optimierung zu betreiben.

Beispiel
Wenn dein IBO wie folgt aussieht:
Code:
  1. 1001,1002,1003
Dann kannst du OpenGL mit
Code:
  1. glDrawRangeElements(mode, 1001, 1003, 3, type, nullptr);
garantieren, dass Vertices 0-1000 nicht aus dem VBO gelesen werden müssen (und auch Vertices 1004 bis unendlich nicht).

Edit: Wenn du nicht mit dem ersten Index im IBO starten willst, musst du einen entsprechenden Offset als letzten Parameter übergeben – egal, ob du nun glDrawRangeElements oder glDrawElements einsetzt.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Zuletzt geändert von glAwesome am So Dez 03, 2017 16:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Zeichengeschwindigkeit
BeitragVerfasst: So Dez 03, 2017 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1071
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Dann würde ich glDrawArrays( empfehlen und auf IBO zu verzichten. Ich denke kaum, das es ein grosse Ersparniss gibt, wen man IBO nimmt, besonders, wen noch Normale ins Spiel kommen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
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.037s | 17 Queries | GZIP : On ]