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

Aktuelle Zeit: Mi Jul 16, 2025 20:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Im moment wird in meiner Engine beim Zeichnen von JEDEM Tile glBindTexture genau zweimal anfgerufen. Ich zeichne erst die Maske und dann das Tile selber, damit es transparent ist. Jedes Tile sowie jede Maske hat eine eigene Textur. Das führt ganz gut zu FPS verlusst. Erst hatte ich die Idee, alle Tiles sowie Masken in einer grossen Textur zu sichern um damit glBindTexture nur einmal pro Render-durchgang aufzurufen und nicht bei jedem einzelnen Tile. Aber dann kann ich das ganze nicht mehr Transparent zeichnen. Hat irgend jemand ne Idee, wie ich das Problem löse? Ich will glBindTexture möglichst selten benutzen und Transparent beibehalten.

Hier der grobe Code:

<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>procedure</span> DrawTiles;
<span class='reserved'>begin</span>
 <span class='reserved'>for</span> x := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>99</span> <span class='reserved'>do</span>  
   <span class='reserved'>for</span> y := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>99</span> <span class='reserved'>do</span>
   <span class='reserved'>begin</span>
     // draw tile mask
     glBindTexture(GL_TEXTURE_2D, Gras^.glMask);
     glBlendFunc(GL_DST_COLOR, GL_ZERO);
     glColor3f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
     glBegin(GL_QUADS);
     glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>);
     glVertex2f(gx, gy - GLHeight(Gras^.Height));
     glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>1.0</span>);
     glVertex2f(gx, gy);
     glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
     glVertex2f(gx + GLWidth(Gras^.Width), gy);
     glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>0.0</span>);
     glVertex2f(gx + GLWidth(Gras^.Width), gy - GLHeight(Gras^.Height));
     glEnd;

     // draw tile
     glBindTexture(GL_TEXTURE_2D, Gras^.glTexture);
     glBlendFunc(GL_ONE,GL_ONE);
     glBegin(GL_QUADS);
     glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>);
     glVertex2f(gx, gy - GLHeight(Gras^.Height));
     glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>1.0</span>);
     glVertex2f(gx, gy);
     glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
     glVertex2f(gx + GLWidth(Gras^.Width), gy);
     glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>0.0</span>);
     glVertex2f(gx + GLWidth(Gras^.Width), gy - GLHeight(Gras^.Height));
     glEnd;
   <span class='reserved'>end</span>;
 <span class='reserved'>end</span>;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 17:53 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Also ich würde es nicht so machen... Ich habe mal eine ähnliche Technik für ein Schulprojekt gemacht... zuahuse lief es gut, aber auf den Schulrechnern nicht... Ursache: diese "Maskierung" wie su sie hier mit Blending versuchst, funzt nur auf Nvidia-Karten.... (zumindest auf ALTEN Atis ging nicht...)

Ich an deiner Stelle würde gleich transparente Texturen verwenden (wenn dein Loader das zuläßt)....

Ps: Ich ahbe eben nochmal nachgesehen:
Du könntest auch zum Laden der Texturen die glbmp-Lib verwenden (downloadlink schwirt hier irgendwo im forum rum) um deine texturen zu laden. Der kannste nämlich auch sagen, dass Sie eine Bestimmte Farbe (mit einer einstellbaren Toleranz) als Transparent ansehen soll... oder, falls dir das lieber ist, kannste sie auch anweisen, eine andere, gleichgroße Textur als Stencil-Maske zu verwenden... (halt etwa dasselbe, was du oben vor hattest, aber halt gleich auf Texturen-Ebene und auf jeder Graka verwendbar.....)

PPS:
Oh sorry... ich muss mich selber leider Korrigieren: :(
es kann sein, dass deine Funktion auch bei anderen Karten funzt... meine damals, als ich das geteste hatte sah so aus:

Code:
  1.  
  2. glenable(gl_blend); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  3. glBlendFunc(gl_src_color,gl_one);
  4.  
  5. glbindtexture(gl_texture_2d,tierecontrast[15]);
  6. glbegin(gl_quads);
  7. gltexcoord2f(0,0);
  8. glvertex3f(300,-0.2,-39.5);
  9.  
  10. gltexcoord2f(1,0);
  11. glvertex3f(300,-0.2,-38.5);
  12.  
  13. gltexcoord2f(1,1);
  14. glvertex3f(300,1.8,-38.5);
  15.  
  16. gltexcoord2f(0,1);
  17. glvertex3f(300,1.8,-39.5);
  18. glend;
  19.  
  20. gldisable(gl_blend);
  21.  
  22. gldisable(gl_depth_test);
  23. glenable(gl_blend);
  24. glBlendFunc(gl_dst_color,gl_zero);
  25.  
  26. glbindtexture(gl_texture_2d,tieretex[15]);
  27. glbegin(gl_quads);
  28. gltexcoord2f(0,0);
  29. glvertex3f(300,-0.2,-39.5);
  30.  
  31. gltexcoord2f(1,0);
  32. glvertex3f(300,-0.2,-38.5);
  33.  
  34. gltexcoord2f(1,1);
  35. glvertex3f(300,1.8,-38.5);
  36.  
  37. gltexcoord2f(0,1);
  38. glvertex3f(300,1.8,-39.5);
  39. glend;
  40.  
  41. gldisable(gl_blend);
  42. glenable(gl_depth_test); &nbsp; &nbsp; &nbsp; &nbsp;
  43.  


Dabei war bei mir das, was gezeichnet werden sollte in der "Kontrattextur" weiß, der Rest schwarz....
Naja: deines könnte hingegen gehen..... habe es aber nun nicht getestet....

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Danke, hat mir sehr geholfen! Habs jetzt ähnlich wie in glBMP gemacht und muss jetzt glBindTexture nur noch 1mal aufrufen, anstatt (MapWidth*MapHeight)mal. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Auch wenn das jetzt schon funktioniert kannst du ja mal beim Rendern etwas ausprobieren.
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
<span class='reserved'>procedure</span> DrawTiles;
<span class='reserved'>begin</span>
// Textur setzen ...
glColor3f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
glBegin(GL_QUADS);
<span class='reserved'>for</span> x := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>99</span> <span class='reserved'>do</span>
<span class='reserved'>for</span> y := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>99</span> <span class='reserved'>do</span>
<span class='reserved'>begin</span>
glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>);
glVertex2f(gx, gy - GLHeight(Gras^.Height));
glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>1.0</span>);
glVertex2f(gx, gy);
glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
glVertex2f(gx + GLWidth(Gras^.Width), gy);
glTexCoord2f(<span class='integer'>1.0</span>, <span class='integer'>0.0</span>);
glVertex2f(gx + GLWidth(Gras^.Width), gy - GLHeight(Gras^.Height));
<span class='reserved'>end</span>;
<span class='reserved'>end</span>;
glEnd;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Jetzt sollte das ganze noch mal schneller gehen. Um es dann noch mal schneller zu machen solltest du aber ein TriangleStrip verwenden.
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
<span class='reserved'>procedure</span> DrawTiles;
<span class='reserved'>begin</span>
// Textur setzen ...
glColor3f(<span class='integer'>1.0</span>, <span class='integer'>1.0</span>, <span class='integer'>1.0</span>);
<span class='reserved'>for</span> x := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>100</span> <span class='reserved'>do</span>
glBegin(GL_TRINGLE_STRIP);
<span class='reserved'>for</span> y := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>99</span> <span class='reserved'>do</span>
<span class='reserved'>begin</span>
glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>);
glVertex2f(gx, gy - GLHeight(Gras^.Height));
glTexCoord2f(<span class='integer'>0.0</span>, <span class='integer'>1.0</span>);
glVertex2f(gx, gy);
<span class='reserved'>end</span>;
glEnd;
<span class='reserved'>end</span>;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
PS: bei dem letzten bin ich mir nicht 100%tig sicher ob die Schleifenanzahl so richtig ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Danke, das erste funktioniert gut, das letztere leider nicht ganz.

Das komtm dabei raus. Isometrie ist aber schon zu erkennen :)

Bild

Ich hab die x-schleife übrigens genausoweit laufen lassen, wie die y schleife. sonst sieht das ganze schiefe aus. Und nicht wundern dass das Bild so klein ist. sind nur noch 10 durchläufe, statt 100.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 20:58 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
das liegt sicherlich an den Tex-Coords...
versuche mal das:
Code:
  1.  
  2. procedure DrawTiles;
  3. begin
  4.  // Textur setzen ...
  5.  glColor3f(1.0, 1.0, 1.0);
  6.  for x := 0 to 100 do &nbsp;
  7.  &nbsp;glBegin(GL_TRINGLE_STRIP);
  8.  &nbsp; for y := 0 to 100 do
  9.  &nbsp; begin
  10.  &nbsp; &nbsp; glTexCoord2f(x, y);
  11.  &nbsp; &nbsp; glVertex2f(gx, gy - GLHeight(Gras^.Height));
  12.  &nbsp; &nbsp; glTexCoord2f(x, y+1);
  13.  &nbsp; &nbsp; glVertex2f(gx, gy);
  14.  &nbsp; end;
  15.  &nbsp;glEnd;
  16.  end;
  17. end;
  18.  

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 24, 2003 21:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Hmm? Aber dann gehen die Texturkoordinaten doch über 1 hinaus, wenn ich die schleifenvariable da einsetze ... dachte die gehen nur von 0 bis 1?

Achja und es geht leider auch so nicht. Ich glaube auch irgendwie nicht, dass es an den Texturkoordinaten liegt. Hier mal ein Bild von dem letzten Source, ohne Texturen.

Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 06:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ups. Vergiss bitte das Zweite was ich vorgeschlagen hatte. Da hab ich wohl ein wenig quatsch erzählt. :rolleyes:
Ich hatte deine Quelle nur kurz überflogen. War ein fehler. Ich dachte es handele sich dabei um eine gerade fläche. So Heightmap ohne höhe.
In diesem Fall hätte man das so machen können.
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> <span class='reserved'>for</span> Row := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>50</span> <span class='reserved'>do</span> <span class='reserved'>begin</span>
glBegin(GL_TRIANGLE_STRIP);
<span class='reserved'>for</span> Col := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>50</span> <span class='reserved'>do</span> <span class='reserved'>begin</span>
glTexCoord2f(<span class='integer'>1</span> / <span class='integer'>50</span> * (Row + <span class='integer'>1</span>), <span class='integer'>1</span> / <span class='integer'>50</span> * Col);
glVertex3f((Row + <span class='integer'>1</span>), <span class='integer'>0</span>, Col);

glTexCoord2f( <span class='integer'>1</span>/ <span class='integer'>50</span> * Row, <span class='integer'>1</span> / <span class='integer'>50</span> * Col);
glVertex3f(Row, <span class='integer'>0</span>, Col);
<span class='reserved'>end</span>;
glEnd;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Bei dir kann man einen TriangleStrip aber leider nicht benutzen, weil du ja auf jedem Quad die Textur komplett benutzt. Dadurch kann es sein, dass 2 Punkte die übereinanderliegen, einmal auf den Anfang und einmal auf das Ende einer Textur zeigen.
Bei einem TriangleStrip würden die Punkte übereinander Fallen und hätten somit ein und die selben Texturkoordinaten. Das Resultat würde so aussehen, dass du die Texturkoordinaten abwechseln muss. Also bei geraden Punkten wären die zum Beispiel am Anfang und sonst am Ende. Das hätte dann den Effekt, dass deine Textur abwechseln richtig und dann gespiegelt dargestellt würden. TriangleStrip geht in deinem Falle leider nicht. Sorry falls dir das unnötige Arbeit gemacht hat. :rolleyes:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 08:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Ach Quatch, war keine unnötige Arbeit, dadurch hab ich noch ne Menge gelernt! Und evtl. kann ich aus dem Code noch was machen, das was ich im ersten Post geschrieben hab ist ja erstmal nur nen Dummy, muss die Texturen eh anders speichern. Ich werds einfach mal ausprobieren :)

Danke!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 11:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
Ist denn der Unterschied zwischen TRIANGLE und TRIANGLE_STRIP sehr gross? Also von der Geschwindigkeit her? Weil ich hab das ganze jetzt so gelöst, dass ich einfach zwei Dreiecke zeichne, anstatt ein Quadrat. Muss dann zwar sechs Punkte angeben anstatt vier, aber sollte doch trotzdem noch wesentlich schneller sein als nen Quadrat, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 11:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TRIANGLE_STRIP ist aufgrund der Tatsache, das ggü. der Nutzung von TRIANGLES weniger Eckpunkte an die GPU übergeben werden müssen und so im Endeffekt weniger Traffic auf dem Bus entsteht.Allerdings sind TRIANGLES immernoch besser als QUADS, da ein QUAD erst von der GPU in zwei TRIANGLES zerlegt werden muss und dies auch Zeit kosten kann.

Ich zähl mal die Primitiventypen von OpenGL auf, angefangen beim langsamsten bis hin zum schnellsten :
GL_POLYGON (Sehr schlecht, da die GPU hier jede Menge Arbeit mit dem Zerlegen in Dreiecke hat)
GL_QUADS (Schon sehr viel schneller, GPU muss aber immernoch nacharbeiten)
GL_TRIANGLES (Natives GPU-Format, allerdings hoher Vertex-Overhead)
GL_TRIANGLE_STRIP (Sehr schnell, wenig Vertex-Overhead)
GL_TRIANGLE_FAN (Noch weniger Vertex-Overhead, allerdings wegen der Form kaum zu gebrauchen)

Du solltest dir allerdings überlegen, ob du deine Geometrie nicht in eine optimierte Struktur bringst.Wenn sich dein Terrain z.B. nie ändert, solltest du es in eine Displayliste kompilieren (schneller gehts nämlich nicht mehr), wenns dynamisch ist, dann solltest du evtl. Vertex-Arrays nutzen die die Sache auch noch um Einiges beschleunigen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 25, 2003 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 24, 2003 15:09
Beiträge: 12
k besten dank für den tipp. kannte VertexArrays nur aus DirectX, werd mir da mal was aneignen und das dann testen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]