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

Aktuelle Zeit: So Jun 09, 2024 03:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Terrain GPU4 - Shader
BeitragVerfasst: So Okt 30, 2011 14:27 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
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 | 5386-mal betrachtet ]
Dateikommentar: ohne Shader
ohne shader.PNG [12.81 KiB]
Noch nie heruntergeladen

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain GPU4 - Shader
BeitragVerfasst: So Okt 30, 2011 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
  • 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. :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain GPU4 - Shader
BeitragVerfasst: Mo Okt 31, 2011 16:44 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
nein daran liegst nicht...

außer:

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

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain GPU4 - Shader
BeitragVerfasst: Mo Okt 31, 2011 21:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain GPU4 - Shader
BeitragVerfasst: Mi Nov 16, 2011 08:12 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
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...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Terrain GPU4 - Shader
BeitragVerfasst: Mi Nov 16, 2011 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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


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


Wer ist online?

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