DGL
https://delphigl.com/forum/

Terrain GPU4 - Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=10142
Seite 1 von 1

Autor:  end [ So Okt 30, 2011 14:27 ]
Betreff des Beitrags:  Terrain GPU4 - Shader

hi,

ich habe den terrain gpu 4 shader mal ausprobiert. Das VBO zeichnet richtig, sobald ich jedoch den shader aktiviere kommt das dabei raus. (s. Bilder)

mein Code:


Code:
  1.  
  2. // in der Render Schleife
  3.  
  4.   glTranslatef(-0,-0,-250);
  5.   glRotatef(100,1,0,0);
  6.  
  7.   glDisable(GL_ALPHA_TEST);
  8.  
  9.   glEnable(GL_TEXTURE_2D);
  10.   textures.Bind('0');  //heightmap binden
  11.   EVTest.UseShader('prg'); //Shader aktivieren
  12.   //glUniform1iARB(glGetUniformLocationARB(EVTest.programs[EVTest.prgnames.IndexOf('prg')], 'heightmap'), 0);
  13.   glUniform2iARB(glGetUniformLocationARB(EVTest.programs[EVTest.prgnames.IndexOf('prg')], 'leafmin'), 0, 0);
  14.  
  15.   glEnableClientState(GL_VERTEX_ARRAY);
  16.   glBindBuffer(GL_ARRAY_BUFFER, VBO);
  17.   glInterleavedArrays(GL_V2F, SizeOf(TGL_V2F), nil);
  18.   glVertexPointer(2, GL_FLOAT, 0, 0);
  19.   glDrawArrays(GL_TRIANGLES, 0, 64*64*6);  
  20.  


// einmalig beim Initialisierungsvorgang.

Code:
  1.  
  2. //laden der Texturen
  3. //etc.
  4.  
  5.     //VBO
  6.  
  7.     glGenBuffers(1, @VBO);
  8.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  9.     glBufferData(GL_ARRAY_BUFFER, 64*64*SizeOf(TGL_V3F), nil, GL_STATIC_DRAW);
  10.     VBOPointer := glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
  11.  
  12.     for s := 0 to 63 do
  13.     begin
  14.       for t := 0 to 63 do
  15.       begin
  16.         VertexPointer    := VBOPointer;
  17.         VertexPointer^.X := s;
  18.         VertexPointer^.Y := t;
  19.         VertexPointer^.Z := 0;
  20.         inc(Integer(VBOPointer), SizeOf(TGL_V3F));
  21.       end;
  22.     end;
  23.  
  24.     glUnMapBuffer(GL_ARRAY_BUFFER);
  25.  
  26.     glClearColor(0.3, 0.4, 0.7, 0.0);  
  27.  
  28.  


Dateianhänge:
Dateikommentar: Mit Shader
mit shader.PNG
mit shader.PNG [ 6.6 KiB | 6236-mal betrachtet ]
Dateikommentar: ohne Shader
ohne shader.PNG [12.81 KiB]
Noch nie heruntergeladen

Autor:  Coolcat [ So Okt 30, 2011 17:14 ]
Betreff des Beitrags:  Re: Terrain GPU4 - Shader

  • dein VBO enthält 64x64 Vertices, du renderst aber auch 64x64 Quads => du brauchst 65x65 Vertices
  • in deinem VBO sind die Vertices nicht als Dreiecke angeordnet. Ich vermute da sollte ein Indexbuffer verwendet werden
  • beim erstellen des VBO benutzt du einen V3F-Datentyp, später beim rendern aber V2F.
  • Du kombinierst glInterleavedArrays mit glVertexPointer. Entscheide dich für eines...

Warum das ohne Shader rendert ist mir allerdings ein Rätsel. :)

Autor:  end [ Mo Okt 31, 2011 16:44 ]
Betreff des Beitrags:  Re: Terrain GPU4 - Shader

nein daran liegst nicht...

außer:

wie macht man indexbuffer? hab nix dazu gefunden... :(

Autor:  Coolcat [ Mo Okt 31, 2011 21:42 ]
Betreff des Beitrags:  Re: Terrain GPU4 - Shader

Ein Indexbuffer, auch Elementbuffer genannt, wird quasi genau wie ein VBO genutzt, nur eben mit der Konstante GL_ELEMENT_ARRAY_BUFFER. Des weiteren wird glDrawArrays durch glDrawElements ersetzt. In einem durchschnittlichen Dreiecks-Mesh wird ein und derselbe Vertex 6mal benutzt. Um Speicher, Bandbreite usw. zu sparen legt man ein Bufferobjekt an das quasi nur jeweils den Arrayindex des Vertex im VBO angibt der benutzt werden soll. Also nur noch ein GLuint pro Vertex. Also im VBO liegen die Vertices wie man lustig ist, im Indexbuffer bilden wie gewohnt immer drei aufeinander folgende Indices ein Dreieck. Der Indexbuffer sorgt auch dafür das die GPU den Cache effizienter nutzen kann, da sie nun weiß welche Vertices sowieso gleich sind.

Code:
  1. // laden
  2. glGenBuffers(1, &m_ibo);
  3. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
  4. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeInBytes, m_indexData, GL_STATIC_DRAW);
  5.  
  6. // rendern
  7. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
  8. glDrawElements(GL_TRIANGLES, m_indexCount, GL_UNSIGNED_INT, 0); // ersetzt glDrawArrays

Autor:  end [ Mi Nov 16, 2011 08:12 ]
Betreff des Beitrags:  Re: Terrain GPU4 - Shader

es lag am VBO, wenn ich es normal zeichne funktioniert alles. Nur das VBO hab ich immer noch nicht hingekriegt. Wie müsste denn der Indexbuffer aussehen? kann ich 1,2,3,1,2,3 reinmachen oder muss ich durchzählen: 1,2,3,4,5,6,7,8,9...

Autor:  sharkman [ Mi Nov 16, 2011 12:10 ]
Betreff des Beitrags:  Re: Terrain GPU4 - Shader

Also angenommen, in deinem Vertexbuffer sind die Vertices so angeordnet (der Ort entspricht hier dem Wert des Vertices, die Zahl der Stelle, an der er im VBO angespeichert ist)
Code:
  1. 1  2  3
  2. 4  5  6
  3. 7  8  9


Dann sieht dein Indexbuffer so aus (die Größeren Abstände hab ich dort gemacht, wo ein Dreieck aus ist)
Code:
  1. 1  4  2    2  4  5    2  5  3    3  5  6    4  7  5    5  7  8    5  8  6    6  8  9 

Eventuell sind die Dreiecke verkehrt herum, auf BackfaceCulling habe ich nicht geachtet

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/