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

Aktuelle Zeit: Fr Apr 19, 2024 11:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Farbwerte für Heightmaps auslesen
BeitragVerfasst: Sa Dez 13, 2014 16:16 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Hi, habe folgenden Code aufs wesentliche gekürzt hier dargestellt:
Code:
  1.  
  2. GLint HeightMap::mapWidth,HeightMap::mapHeight;
  3. GLubyte *HeightMap::yValueBuffer;
  4. GLfloat *HeightMap::hmVertexBuffer;
  5. unsigned int *HeightMap::hmIndices;
  6.  
  7. void HeightMap::getRedFromMipMap(int mipMapLevel)
  8. {
  9.     GLint textureWidth, textureHeight;
  10.     glBindTexture(GL_TEXTURE_2D,textureName[0]);
  11.     glGetTexLevelParameteriv(GL_TEXTURE_2D, mipMapLevel, GL_TEXTURE_WIDTH, &textureWidth);
  12.     glGetTexLevelParameteriv(GL_TEXTURE_2D, mipMapLevel, GL_TEXTURE_HEIGHT, &textureHeight);
  13.     mapWidth=textureWidth;
  14.     mapHeight=textureHeight;
  15.  
  16.     yValueBuffer= (GLubyte *)malloc(textureWidth*textureHeight*4);
  17.     glGetTexImage(GL_TEXTURE_2D, mipMapLevel, GL_BGRA, GL_UNSIGNED_BYTE, yValueBuffer);
  18. }
  19.  
  20. void HeightMap::doHeightMapStuff()
  21. {
  22.     glBindTexture(GL_TEXTURE_2D,textureName[0]);
  23.     getRedFromMipMap(0);
  24.     hmVertexBuffer=(GLfloat *)malloc(mapWidth*mapHeight*3);
  25.  
  26.     for(int y = 0; y < mapHeight; y++)
  27.         for(int x = 0; x < mapWidth; x++)
  28.         {
  29.             GLint startAdressOfVertex=((y*mapWidth) + x);
  30.  
  31. //            hmVertexBuffer[startAdressOfVertex]=(float)x;
  32. //            hmVertexBuffer[startAdressOfVertex+1]=(float)yValueBuffer[((y*mapWidth) + x)*4];
  33. //            hmVertexBuffer[startAdressOfVertex+2]=(float)y;
  34.         }
  35. }
  36.  

Sobald ich eine der letzten drei Zeilen hinein nehme stürzt er einfach ab.
es läuft wenn man
Code:
  1. hmVertexBuffer=(GLfloat *)malloc(mapWidth*mapHeight*4);
setzt. Allerdings fände ich das irgendwie sinnfrei, 4x Speicher zu reservieren, wenn jeder Vektor nur 3 floats hat...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 13, 2014 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Weil du nicht genügend Speicher reserviert hast:
Code:
  1. malloc(mapWidth*mapHeight*3);
Der Parameter von malloc ist immer in Bytes. Ein GLfloat ist aber größer als 1 Byte. Daher multiplizier nochmal mit sizeof(GLfloat).

Wenn du ohne sizeof()-Operator und Pointercasting arbeiten willst, nimm new statt malloc (dann aber auch delete[] statt free). Und wenn du guten, fehlervermeidenden und wartbaren Code schreiben willst, nimm std::vector.

Übrigens solltest du startAdressOfVertex auch nochmal mal 3 nehmen.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 13, 2014 16:45 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Wollte alles mal probiert haben.
Dachte dafür wäre das =(GLfloat *) vor malloc da?

Hab nun auch den Rest, aber auch hier schmiert er immer ab:
Code:
  1.  
  2. hmIndices=(unsigned GLint *)malloc((mapWidth-1)*(mapHeight-1)*4*sizeof(unsigned GLint));
  3.     for(int y = 0; y < mapHeight-1; y++)
  4.         for(int x = 0; x < mapWidth-1; x++)
  5.         {
  6.             GLint startAdressOfVertex=((y*mapWidth) + x)*4;
  7.             hmIndices[startAdressOfVertex]=((y*mapWidth) + x)*3;
  8.             hmIndices[startAdressOfVertex+1]=((y*mapWidth) + x +1)*3;
  9.             hmIndices[startAdressOfVertex+2]=(((y+1)*mapWidth) + x+1)*3;
  10.             hmIndices[startAdressOfVertex+3]=(((y+1)*mapWidth) + x)*3;
  11.         }
  12.     heightMapDisplayListNumber=glGenLists(1);
  13.     glNewList(heightMapDisplayListNumber,GL_COMPILE);
  14.         glEnableClientState(GL_VERTEX_ARRAY);
  15.         glVertexPointer(3,GL_FLOAT,0,hmVertexBuffer);
  16.         glDrawElements(GL_QUADS,(mapWidth-1)*(mapHeight-1)*4,GL_UNSIGNED_INT,hmIndices);
  17.         glDisableClientState(GL_VERTEX_ARRAY);
  18.     glEndList();
  19.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 13, 2014 18:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Psst: code=cpp

Vergleich mal Zeilen 2 und 6:
Code:
  1. /*... */malloc((mapWidth-1)*(mapHeight-1)*4//...
  2. GLint startAdressOfVertex=((y*mapWidth) + x)*4;

Passt nicht zusammen, oder?


Edit:
Skeltek hat geschrieben:
Dachte dafür wäre das =(GLfloat *) vor malloc da?
Dieses Pointercasting-Konstrukt tut genau genommen gar nichts. Es erlaubt dir nur, einem GLfloat-Zeiger einen void*-Wert zuzuweisen. GLfloat* und void* wären nämlich eigentlich (in diese Zuweisungsrichtung) inkompatibel.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 13, 2014 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Am Besten du schmeißt den Kram wie mapHeight-1 raus. Wenn du tatsächlich -1 Rechnen willst solltest du das einmal vorher machen und nicht 3000 mal :)

Achja und Klammern sollte man auch nur dann setzen wenn wirklich nötig :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 14, 2014 00:36 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Bekomme das nicht hin, wir gucken hier grade zu dritt drauf und finden den Fehler nicht. Die QUADS sind total verschoben und verdreht im Gesammtcode.
ps: endlich hinbekommen. Da waren ständig 3 Heightmaps übereinander, das war mal eine Quälerei. Danke nochmal für die Tips oben.
Gruß, Skel


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 14, 2014 03:28 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Hab ja wie gesagt die restlichen Fehler nun doch selbst gefunden. Es ist immer etwas schwierig, wenn die Interpretation der Befehlsdokumenta nicht eindeutig ist bzw zur eindeutigen Interpretation bereits das Verstehen der Syntax anderer Befehle wieder voraussetzt >.>

Jetzt hat sich ein neues Problem ergeben:
Die Heightmap steht, sieht hübsch aus, mit berechneten Normalenvektoren usw.
Allerdings verschwindet je nach Position und Kamerawinkel die Heightmap(in DisplayListe gespeichert) schlagartig komplett vom Bildschirm und wird nicht gezeichnet.
Hat vielleicht jemand einen "wild guess" oder mehrere Ideen, wo sich erfahrungsgemäß solche (Anfänger?)Fehler verstecken?
Ich würde ja Codeschnipsel posten, aber es ist schwer von den 12k Zeilen Code die relevanten Stellen herauszukopieren, wenn man noch nicht einmal Verdächtige hat...
Die Heightmap ist übrigens in der DisplayList zentriert, d.h. sie geht von Ecke (-256,-10,-256) bis Ecke (255,-10,255).
Die Perspektive geht von range 0.125 bis 1024.

Liegt es daran, dass es eine großes drawElements(GL_QUADS) ist anstelle vieler kleiner Teilsegmente?
Wird das vielleicht weg geschnitten, weil der Mittelpunkt der DisplayList hinter dem Spieler liegt oder sowas? Schließe ich zwar grade aus, aber mit Sicherheit kann man als blutiger Anfänger ja wirklich nichts sagen...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 14, 2014 12:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Verschwindet die Heightmap, wenn du von unten draufguckst? -> Backface Culling könnte der Grund sein.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 14, 2014 14:14 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Leider nein, das hab ich schon kontrolliert.
Beim erstellen:
Code:
  1.  
  2. heightMapDisplayListNumber=glGenLists(1);
  3.     glDisable(GL_LIGHTING);
  4.     glDisable(GL_CULL_FACE);
  5.     glNewList(heightMapDisplayListNumber,GL_COMPILE);
  6.     glPushMatrix();
  7.         glEnableClientState(GL_VERTEX_ARRAY);
  8.         glVertexPointer(3,GL_FLOAT,0,hmVertexBuffer);
  9.         glDrawElements(GL_QUADS,(mapWidth-1)*(mapHeight-1)*4,GL_UNSIGNED_INT,hmIndices);
  10.         glDisableClientState(GL_VERTEX_ARRAY);
  11.         glPopMatrix();
  12.     glEndList();
  13.     glEnable(GL_CULL_FACE);
  14.     glEnable(GL_LIGHTING);
  15.  

Beim abrufen:
Code:
  1.  
  2.     glDisable(GL_LIGHTING);
  3.     glDisable(GL_CULL_FACE);
  4.     glColor4f(1,1,1,1);
  5.     glCallList(HeightMap::heightMapDisplayListNumber);
  6.     glEnable(GL_CULL_FACE);
  7.     glEnable(GL_LIGHTING);
  8.  

Der gesammte Boden verschwindet, wenn man ca Richtung Osten schaut in Richtung +x Achse. Ist aber noch Positionsabhängig ab welchen Winkeln es verschwindet.

Habe das ganze erstmal unterhalb des Koordinatenursprungs gezeichnet:
Code:
  1.  
  2.     hmVertexBuffer=(GLfloat *)malloc(mapWidth*mapHeight*3*sizeof(GLfloat));
  3.  
  4.     for(int y = 0; y < mapHeight; y++)
  5.         for(int x = 0; x < mapWidth; x++)
  6.         {
  7.             GLint startAdressOfVertex=((y*mapWidth) + x)*3;
  8.  
  9.             hmVertexBuffer[startAdressOfVertex]=(GLfloat)x-256;
  10.             hmVertexBuffer[startAdressOfVertex+1]=(GLfloat)yValueBuffer[((y*mapWidth) + x)*4]/10-20;
  11.             hmVertexBuffer[startAdressOfVertex+2]=(GLfloat)y-256;
  12.         }
  13.  

bevor ich später die DisplayListe direkt im Ursprung abrufe.
Das ganze sieht erstmal so aus(Ingame-Screenshot):
Hab auf Gridview umgeschaltet, aber auch bei front and back, fill verschwindet es genauso, wenn man bei bestimmten winkeln drauf sieht.
In der Regel sieht man es nicht wenn man in folgende Richtungen schaut:
Osten: von ca(-10,0,1), über(0,0,1), bis ca(10,0,1),
Oben/Unten: (0,-1,0), (0,1,0) ab ca 30% Kamera Steigungswinkel,

Man sieht es bei: nach (0,0,-1) schauen, bis zu 100° linksrechts, 30° hoch runter,
Nach (1,-1,-1) und (-1,-1,-1) gibt es einen sehr schmalen Kamerawinkel ca 2-3°, wo man es trotzdem sieht.

ps: Das Problem hab ich anscheinend auf meinem Rechner. Auf dem Rechner meines Projektpartners tritt es nicht auf. Komisch, denn es wird ja nichts Betriebssystem-spezifisches für die Heightmaps verwendet...


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 14, 2014 15:51 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Kann es daran liegen, dass ich einen riesigen VertexArray verwende anstelle von vielen kleinen Dreiecken/Rechtecken?
Wieso werden im Terrain Tutorial1 dieser Seite Dreiecke anstelle von Vertex Arrays verwendet? Wegen Einsteigerfreundlichkeit nehme ich an?
Will nur sicher gehen, dass es nicht am VA liegt.
Gruß, Skel

ps: wie gesagt, auf dem Rechner meines Kollegen läuft es ja...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 18, 2014 09:31 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Hi alle
ich wollte mich hiermit noch einmal für die gute Hilfe bedanken, die ich hier im Verlaufe meines Projektes bekommen habe. Wir bekamen volle Punktzahl in allen Kategorien.
Hier ein Photo mit dem letzten verbleibenden Bug.
Dateianhang:
ScreenShot.jpg

Ich habe einen Kamerawinkel erwischt, bei dem die Heightmap im See gezeichnet wird, aber nicht oberhalb der Wasseroberfläche.
Drehe ich nun die Kamera 1 ° nach links, werden sowohl gespiegelte als auch normale Heightmap gezeichnet.
Drehe ich stattdessen die Kamera um 1° nach rechts,, werden weder die Heightmap noch ihre gespiegelte Version gezeichnet.

Mein Rechner zuhause auf dem ich das Projekt vorwiegend entwickelt habe, ist ist der einzige Testrechner, der bei bestimmten Winkeln die Heightmap nicht zeichnet; wobei es auch der einzige Testrechner mit einer Radeon Grafikkarte war.
Das Projekt ist zwar abgeschlossen, falls jedoch jemand eine Idee hätte woran der Bug liegen könnte, wäre ich ziemlich dankbar.
Der Bug tritt übrigens nur bei der Heightmap auf, und die Größe der Heightmap spielt dabei keine Rolle.
Die Heightmap ist ein einfaches glDrawElements.


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 18, 2014 11:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Schwer zu sagen. Eine mögliche Ursache könnten fehlende MipMap-Level sein, sofern das Terrain eine Textur hat. GTA San Andreas hatte dieses Problem auf einigen Grafikkarten. Siehe z.B. hier. Ansonsten probier vielleicht mal eine Grafiktreiber-Update.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 18, 2014 18:28 
Offline
DGL Member

Registriert: Do Nov 20, 2014 03:18
Beiträge: 36
Wohnort: Stuttgart
Programmiersprache: C++ (Java, Ada,...)
Sind nur Polygone, ohne Texturen oder Beleuchtung. Ab einer bestimmten Kamerarichtung verschwinden sie einfach allesammt auf einmal.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 20, 2014 17:26 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Naja, im Zweifelsfall sind AMD/ATI Karten dafür bekannt, buggy Treiber zu haben ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 20, 2014 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

könnte sein, dass bei deinem Grafiktreiber irgend eine Form von Culling-Optimierung eingestellt ist.

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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