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

Aktuelle Zeit: Di Jun 04, 2024 08:04

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 19:54 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo mal wieder :)

heute aber ich versucht mein Terrain mit einem IBO zu verbinden aber irgendwie sieht das ganze bisschen putzig aus *siehe bild* :D

erstellt wird das ganze in dieser form

Code:
  1.  
  2. const
  3.   DATASize = 4096;
  4.   VBOSize = 64;
  5.  
  6. procedure TMap.InitVBO;
  7. var
  8.   Data : array[0..DATASize] of TVertex2V;
  9.   iData : array[0..DATASize] of GLShort;
  10.   mverts, datasize, pos, x, y : Integer;
  11. begin
  12.  
  13.   pos := 0;
  14.   glGenBuffers(1, @VBO);
  15.   glBindBuffer(GL_ARRAY_BUFFER, VBO);
  16.   mverts := VBOSize+1;
  17.   datasize := mverts*mverts*2*sizeof(GLFLOAT);
  18.  
  19.  
  20.   for y := 0 to mverts do
  21.     for x := 0 to mverts do begin
  22.       data[pos].x := x;
  23.       data[pos].z := y;
  24.       inc(pos);
  25.     end;
  26.   glBufferData(GL_ARRAY_BUFFER, datasize, @data, GL_STATIC_DRAW);
  27.  
  28.   glGenBuffers(1, @IBO);
  29.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
  30.   datasize := mverts*mverts*2*sizeof(GLshort);
  31.   pos := 0;
  32.   for y := 0 to VBOSize do
  33.     for x := 0 to VBOSize do begin
  34.       idata[pos] := (x+0) + (y+0) * mverts;
  35.       idata[pos] := (x+0) + (y+1) * mverts;
  36.       idata[pos] := (x+1) + (y+1) * mverts;
  37.       idata[pos] := (x+1) + (y+1) * mverts;
  38.       idata[pos] := (x+1) + (y+0) * mverts;
  39.       idata[pos] := (x+0) + (y+0) * mverts;
  40.     end;
  41.   glBufferData(GL_ELEMENT_ARRAY_BUFFER, datasize, @idata, GL_STATIC_DRAW);
  42. end;


gerendert wird mit hilfe des Terrain shaders von coolcat wobei ich nur den Vertex teil übernommen habe und mit dem Fragment shader was anderes vor habe

der rendercode sieht ganz normal aus

Code:
  1. procedure TMap.Render;
  2. var x, y : Integer;
  3. begin
  4.   for x := 0 to 15 do
  5.     for y := 0 to 15 do begin
  6.       glUniform2i(leafmin, x*64,y*64);
  7.       glInterleavedArrays(GL_V2F, SizeOf(TVertex2V), nil);
  8.       glDrawArrays(GL_TRIANGLES, 0, 4096*SizeOf(TVertex2V));
  9.     end;
  10.    
  11.   glUseProgram(0);
  12. end;


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Könnte möglicherweise am Backface-Culling liegen. Dreh das mal testweise rum bzw. schalte es ab.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 20:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Da sind indicies kaputt würde ich sagen. Kannst du bitte mal näher ran gehen und vorallem eine PNG und keine JPEG hochladen? JPEG ist für screenshots hochgradig ungeeignet wegen verlustbehafteter und nicht für harte kanten ausgelegter Kompression.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 20:52 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
das culling ist bereits ausgeschaltet

hier ist das neue bild


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 21:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Kannst du mal einen Screenshot von genau oben machen? Sind die X/Z-Koordinaten richtig? Der Shader sollte ja nur die Höhe ändern.
Irgendwie sieht es für mich aus als wären die Dreiecke skaliert (vielleicht um die Hälfte) und irgendwie gespiegelt?

TVertex2V hat nur x und z, richtig? Nicht das der noch ein y dazwischen hat, weil du den ja als GL_V2F benutzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 21:17 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
das stimmt TVertex2V heißt nicht umsonst so :p

hier ist nochmal ein neues bild von soweit oben wie ich es nur hin bekommen konnte da noch was mit meinem Winkelberechnungen nicht stimmt :D


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Mo Aug 13, 2012 22:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Zum Zeichnen mit Indices verwendet man doch glDrawElements, oder ist das bei den Interleaved-Arrays anders?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 09:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2622
Wohnort: Berlin
Programmiersprache: Go, C/C++
Deine Magic Numbers sind auf jedenfall nicht korrekt, was zu falschen darstellungen führen wird, da du die Koordinaten falsch setzt und noch einige out of bound fehler im gl context generierst.
Zitat:
mverts := VBOSize+1;

Statt 32768Bytes hantierst du mit 33800Bytes und die for-Schleifen sind entsprechend auch 1 zu weit.
Wieso du keine "out of bound" exception schon befüllen bekommst wundert mich.
Ich vermisse das pos im indice for-Schleifen block, wenn du kein copy/paste fehler gemacht hast schreibst du die ganze zeit immer den gleichen index und dann ist dort auch noch der Schleifenbereich um 2 zu groß.
Da du x+1 und y+1 verwendest und noch
Code:
  1. mverts := VBOSize+1;
hast.
Das sollte eventuell schon helfen, wenn da nicht noch woanders ein Problem lauert.
Code:
  1. mverts := VBOSize;
  2. ...
  3.   for y := 0 to VBOSize-1 do
  4.     for x := 0 to VBOSize-1 do begin
  5.       idata[pos] := (x+0) + (y+0) * mverts;
  6.       idata[pos+1] := (x+0) + (y+1) * mverts;
  7.       idata[pos+2] := (x+1) + (y+1) * mverts;
  8.       idata[pos+3] := (x+1) + (y+1) * mverts;
  9.       idata[pos+4] := (x+1) + (y+0) * mverts;
  10.       idata[pos+5] := (x+0) + (y+0) * mverts;
  11.       pos+=6;
  12.     end;

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 11:10 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
also nach dem was du mir da gerade aufgeschrieben hast würde ich ~24000 Indices benötigen :shock:
und das für nur 4096 Vertices.

Wobei mir auch 4000 Vertices etwas viel vorkommt, rauskommen soll ein Block von 64x64 Quadraten wobei jedes Quadrat aus 2 Dreiecken besteht.

Die Vertices scheinen so zu stimmen der Shader arbeitet anscheinend auch gut nur die Indices wollen nicht so wie ich will.
Auch der Ansatz von TAK2004 bringt leider kein wirkliches Ergebnis, wenn ich das so mache habe ich auf einmal ganz viele lange schnipsel als ob einer meine Landschaft durch den Schredder gejagt hätte :D

lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2622
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ups, darauf hab ich nicht geachtet, die index Daten sind noch murks.
Code:
  1. iData : array[0..DATASize] of GLShort;

zu
Code:
  1. iData : array[0..DATASize*6] of GLShort;

und
Code:
  1. datasize := mverts*mverts*2*sizeof(GLshort);

zu
Code:
  1. datasize := mverts*mverts*6*sizeof(GLshort);


So renderst du dann 2 Triangle pro feld und pro Triangle brauchst du 3 indices=>6 indices pro Feld.
Dann der Renderbefehl:
Code:
  1. glDrawArrays(GL_TRIANGLES, 0, 4096*SizeOf(TVertex2V));

zu
Code:
  1. glDrawArrays(GL_TRIANGLES, 0, DATASize*6);

Der 3. Parameter gibt an, wieviele Indices verwendet werden sollen und durch Triangle weiß er, dass er durch 3 teilen muss und dann die Anzahl an Triangle hat, die er rendert.

Edit: Um die Indices zu reduzieren, kannst du auf GL_TRIANGLE_STRIP umstellen.
Um das Caching zu erhöhen macht es sinn das Triangle Strip von innen nach aussen, wie ein Schneckenpanzer zu generieren.
Das ist aber dann keine triviale Schleife und im aktuellem Stadium wohl ein bisschen overdose.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 15:08 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Schläfer hat geschrieben:
Zum Zeichnen mit Indices verwendet man doch glDrawElements, oder ist das bei den Interleaved-Arrays anders?


Davon ging ich auch immer aus. Kann's sein das du einfach nur deinen Vertexbuffer zeichnest und deshalb nur einen Teil der Triangles siehst?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2622
Wohnort: Berlin
Programmiersprache: Go, C/C++
Mh, ich hab mal in mein Code geguckt, weil ich schon gut 1-2Jahre kein OpenGL mehr angerührt hab und in opengl2 und 3 wrapper code hab ich glDrawArrays ohne indices und glDrawRangeElements mit.
Damit ist das also auch ein Fehler.

Code:
  1. glDrawRangeElements(GL_TRIANGLES,0,DATASize,DATASize*2,GL_UNSIGNED_SHORT,0);

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain und IBO
BeitragVerfasst: Di Aug 14, 2012 17:22 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
okay ja jetzt hab ich es :D

die lösung sieht nun genau so aus

Code:
  1.  
  2. const
  3.   DATASize = 4096;
  4.   VBOSize = 64;
  5.  
  6. procedure TMap.InitVBO;
  7. var
  8.   Data : array[0..DATASize] of TVertex2V;
  9.   iData : array[0..DATASize*6] of GLuShort;
  10.   mverts, data_size, pos, x, y : Integer;
  11. begin
  12.  
  13.   pos := 0;
  14.   glGenBuffers(1, @VBO);
  15.   glBindBuffer(GL_ARRAY_BUFFER, VBO);
  16.   mverts := VBOSize+1;
  17.   data_size := mverts*mverts*2*sizeof(GLFLOAT);
  18.  
  19.  
  20.   for y := 0 to mverts do
  21.     for x := 0 to mverts do begin
  22.       data[pos].x := x;
  23.       data[pos].z := y;
  24.       inc(pos);
  25.     end;
  26.   glBufferData(GL_ARRAY_BUFFER, data_size, @data, GL_STATIC_DRAW);
  27.  
  28.   glGenBuffers(1, @IBO);
  29.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
  30.   data_size := mverts*mverts*6*sizeof(GLushort);
  31.   pos := 0;
  32.   for y := 0 to VBOSize-1 do
  33.     for x := 0 to VBOSize-1 do begin
  34.       idata[pos] := (x+0) + (y+0) * mverts;
  35.       idata[pos+1] := (x+0) + (y+1) * mverts;
  36.       idata[pos+2] := (x+1) + (y+1) * mverts;
  37.       idata[pos+3] := (x+1) + (y+1) * mverts;
  38.       idata[pos+4] := (x+1) + (y+0) * mverts;
  39.       idata[pos+5] := (x+0) + (y+0) * mverts;
  40.       inc(pos,6);
  41.     end;
  42.   glBufferData(GL_ELEMENT_ARRAY_BUFFER, data_size, @idata, GL_STATIC_DRAW);
  43. end;
  44.  
  45.  
  46. procedure TMap.Render;
  47. var x, y : Integer;
  48. begin
  49.   glUseProgram(Shader.ProgramObject);
  50.  
  51.   for x := 0 to 15 do
  52.     for y := 0 to 15 do begin
  53.       glUniform2i(leafmin, x*63,y*63);
  54.       glInterleavedArrays(GL_V2F, SizeOf(TVertex2V), nil);
  55.       glDrawRangeElements(GL_TRIANGLES,0,DATASize,DATASize*6,GL_UNSIGNED_SHORT,0);
  56.     end;
  57.  
  58.   glUseProgram(0);
  59. end;
  60.  


danke für eure Hilfe ich werde mich sicher wieder melden :D


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 29 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.011s | 14 Queries | GZIP : On ]