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

Aktuelle Zeit: Di Mai 14, 2024 20:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Terrain Mesh mit VBO & Shader
BeitragVerfasst: So Dez 12, 2010 17:16 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Hallo,
ich schlage mich immer noch / schon wieder mit der Shaderisierung meiner Terrain-Darstellung rum. Es scheitert schon beim rendern des Grundmeshes (also nur ein Netz aus einer TriangleStrip), dessen Höhe überall gleich 0 ist. :oops: Im bewährten Immediate Mode funktionierte das ganze einwandfrei auf Anhieb. Also habe ich versucht, den Immediate Mode 1:1 in einen VBO zu kopieren, doch schon das will nicht funktionieren. :(

Damit ihr das Problem besser nachvollziehen könnt, habe ich mal zwei Screenshots mit angehängt (gerendert im Wireframe-Modus).

Auch wenn ich sowas eigentlich ungerne tue, poste ich dann also mal den kompletten Code zum Vergleichen:
edit: zur besseren Übersicht hier noch mal mit Syntaxhighlighting: RenderImmediate und LoadToVBO.
Code:
  1. void C3D_StaticTerrain::RenderImmediate(void)
  2. {
  3.   // Buffer erzeugen
  4.   SVertex3f* pvCoords = NULL;
  5.   pvCoords  = new SVertex3f[usBlockRes * usBlockRes];
  6.   if(pvCoords == NULL)
  7.   {
  8.     delete[] pvCoords;
  9.     return;
  10.   }
  11.  
  12.   float fx = -fSmallestBlockSize * 0.5f;
  13.   float fz;
  14.   float fstep = fSmallestBlockSize / float(usBlockRes);
  15.   unsigned short x, z, i=0;
  16.   for(x=0; x<usBlockRes; ++x)
  17.   {
  18.     fz = -fSmallestBlockSize * 0.5f;
  19.     for(z=0; z<usBlockRes; ++z)
  20.     {
  21.       pvCoords[i].x = fx;
  22.       pvCoords[i].y = 0.0f;
  23.       pvCoords[i].z = fz;
  24.       fz += fstep;
  25.       ++i;
  26.     }
  27.     fx += fstep;
  28.   }
  29.  
  30.   // Rendern
  31.   glBegin(GL_TRIANGLE_STRIP);
  32.   for(x=0; x<usBlockRes-1; ++x)
  33.   {
  34.     z = 0;
  35.     i = x*usBlockRes;
  36.     glVertex3fv((float*) &pvCoords[i]);
  37.     glVertex3fv((float*) &pvCoords[i]);
  38.  
  39.     i += usBlockRes;
  40.     glVertex3fv((float*) &pvCoords[i]);
  41.  
  42.     for(z=1; z<usBlockRes; ++z)
  43.     {
  44.       i -= usBlockRes -1;
  45.       glVertex3fv((float*) &pvCoords[i]);
  46.  
  47.       i += usBlockRes;
  48.       glVertex3fv((float*) &pvCoords[i]);
  49.     }
  50.  
  51.     glVertex3fv((float*) &pvCoords[i]);
  52.   }
  53.   glEnd();
  54.  
  55.   delete[] pvCoords;
  56. }


Und hier die VBO-Ladefunktion:
Code:
  1. bool C3D_StaticTerrain::LoadToVBOFailsafe(void)
  2. {
  3.   SVertex2f* pvCoords = NULL;
  4.   pvCoords  = new SVertex2f[usBlockRes * usBlockRes];
  5.   if(pvCoords == NULL)
  6.   {
  7.     delete[] pvCoords;
  8.     return false;
  9.   }
  10.  
  11.   float fx = -fSmallestBlockSize * 0.5f;
  12.   float fz;
  13.   float fstep = fSmallestBlockSize / float(usBlockRes);
  14.   unsigned short x, z, i=0, v;
  15.   for(x=0; x<usBlockRes; ++x)
  16.   {
  17.     fz = -fSmallestBlockSize * 0.5f;
  18.     for(z=0; z<usBlockRes; ++z)
  19.     {
  20.       pvCoords[i].x = fx;
  21.       pvCoords[i].y = fz;
  22.       fz += fstep;
  23.       ++i;
  24.     }
  25.     fx += fstep;
  26.   }
  27.  
  28.   // Herleitung von size:
  29.   // x * (3 + (z-1) * 2 + 1)
  30.   // x * (2 + 2z)
  31.   // 2x + 4xz
  32.   // x == z
  33.   // 2x + 4xx
  34.   const unsigned short size = 8*(2*usBlockRes + 4*usBlockRes*usBlockRes);
  35.   VBO.Create(size);
  36.   float* pBuf = (float*) VBO.MapBuffer();
  37.   if(pBuf == NULL)
  38.     return false;
  39.  
  40.   v = 0;
  41.   for(x=0; x<usBlockRes-1; ++x)
  42.   {
  43.     z = 0;
  44.     i = x*usBlockRes;
  45.     pBuf[v] = pvCoords[i].x;  ++v;
  46.     pBuf[v] = pvCoords[i].y;  ++v;
  47.  
  48.     pBuf[v] = pvCoords[i].x;  ++v;
  49.     pBuf[v] = pvCoords[i].y;  ++v;
  50.  
  51.     i += usBlockRes;
  52.     pBuf[v] = pvCoords[i].x;  ++v;
  53.     pBuf[v] = pvCoords[i].y;  ++v;
  54.  
  55.     for(z=1; z<usBlockRes; ++z)
  56.     {
  57.       i -= usBlockRes -1;
  58.       pBuf[v] = pvCoords[i].x;  ++v;
  59.       pBuf[v] = pvCoords[i].y;  ++v;
  60.  
  61.       i += usBlockRes;
  62.       pBuf[v] = pvCoords[i].x;  ++v;
  63.       pBuf[v] = pvCoords[i].y;  ++v;
  64.     }
  65.  
  66.     pBuf[v] = pvCoords[i].x;  ++v;
  67.     pBuf[v] = pvCoords[i].y;  ++v;
  68.   }
  69.  
  70.   VBO.UnmapBuffer();
  71.   delete[] pvCoords;
  72.   return true;
  73. }


Achja und der Vertexshadercode:
Code:
  1. attribute float a_x;
  2. attribute float a_z;
  3.  
  4. uniform vec2 u_vOffset;
  5. uniform float u_fStepsize;
  6.  
  7. varying float v_x;
  8. varying float v_z;
  9.  
  10. void main(void)
  11. {
  12.   vec4 vPos;
  13.   vPos.x = u_vOffset.x + a_x * u_fStepsize;
  14.   vPos.z = u_vOffset.y + a_z * u_fStepsize;
  15.  
  16.   vPos.w = 1.0;
  17.   vPos.y = 0.0;
  18.  
  19.   v_x = a_x * 0.1;
  20.   v_z = a_z * 0.1;
  21.  
  22.   gl_Position = gl_ModelViewProjectionMatrix * vPos;
  23. }


... und der Fragmentshadercode (das Einfärben diente nur zum Debugging):
Code:
  1. varying float v_x;
  2. varying float v_z;
  3.  
  4. void main(void)
  5. {
  6.   gl_FragColor = vec4(v_x, 1.0, v_z, 1.0);
  7. }


Ich bin mir relativ sicher, dass der Fehler beim Laden der Daten in den VBO passieren muss. Der Shader kompiliert einwandfrei und ich habe das Programm auch schon etwas mit gDEBugger analysiert. gDEBugger findet keinen GLerror und zeigt als Inhalt des VBO den Müll an, der auch auf dem Screenshot zu sehen ist (nur halt in Zahlenform).

Sorry für den langen Post, ich hoffe ihr könnt mir weiter helfen. Vielen Dank schonmal im Voraus! :)

edit2: Zum besseren Verständnis, wie ich das Terrain rendern will habe ich noch eine Ansicht von oben als Skizze angehängt.


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


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


Wer ist online?

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