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

Aktuelle Zeit: So Jul 06, 2025 18:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Heightmaps
BeitragVerfasst: Do Dez 06, 2007 21:00 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
Hallo Leute,

ich versuche gerade mit Heightmaps ein kleine Landschaft zu generieren.

So wie in dem Tutorial vom Wiki, nur lasse ich das mit der Skybox vorerst einmal aus.
In dem Tutorial werden leider Sachen verwendet die ich selber nicht zur Verfügung habe oder nicht kenne.

Ich Code mit C++, und benutzte SDL für die Initsialisierung von OpenGL und IMG_Load zum Bilder laden.

Jetzt möchte ich wie es im Tutorial auch heißt das Bild einmal in einen Array laden, halte ich einfach mal für eine gute Idee.

Wie mache ich das am besten. Kann ich da den Grauwert von jedem einzelnen Pixel auslesen, und speichern? Mit welcher Funktion kann ich den Pixel überprüfen und in einen Array speichern.

Folgendes habe ich bis jetzt einmal wie folgt gemacht:

Code:
  1. heightmap = IMG_Load("heightmap.jpg");
  2. glGenTextures(1, &TextureID);
  3. glBindTexture(GL_TEXTURE_2D, TextureID);
  4.  
  5. glTexImage2D(GL_TEXTURE_2D, 0, 3, heightmap->w, heightmap->h, 0, GL_RGB, GL_UNSIGNED_BYTE, heightmap->pixels);
  6.    
  7. SDL_FreeSurface(heightmap);


Bitte um Infos wie ich da jetzt speziell weiter machen könnte. Bräuchte nur die richtigen Infos, Funktionen oder Stichwörter, damit ich eventuell in einem C/C++ speziellen Forum weiter suchen/fragen könnte.

lg und danke für eventuelle Infos
Darian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 00:17 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du musst den Highmap doch gar nicht in eine Textur laden.
Du lädst ihn per IMG_Load in den Speicher und legst dann aus Komfortgründen ein Array auf heightmap->pixel.
Und aus diesem Array liest du dann die Höheninformationen als Unsigned Byte aus wenn du ein Graustufenbild hast.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 09:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

Du lädst mit IMG_Load dein Graustufenbild in den Speicher. heightmap->pixels verweist dann auf die einzelnen Pixel die jeweils mit 3Byte (24Bit) angegeben werden dürften (es sei denn du konvertierst das ganze noch irgendwie).
Allerdings ist dieses Array eindimensional. Für eine Heightmap bietet sich aber ein 2-dimensionales Array an, das dann pro Eintrag die höhe der Heightmap an dem entsprechenden Punkt repräsentiert. Dies kannst du erreichen, in dem du ein entsprechendes 2-dimensionales Array mit heightmap->w * heightmap->h einträgen erstellst (ein Eintrag = 1 Byte (unsigned char)) und die Daten von hightmap->pixels da rein kopierst. Allerdings immer nur einen der 3 Werte pro Pixel, da du ein Graustufenbild hast und die anderen demnach nicht brauchst.

Hier mal ein Codeschnipsel von mir, der ein 2-dimensionales Array benutzt in dem direkt vertex-daten gespeichert werden
(ungetestet)

Code:
  1.  
  2. // hightmap sei die Hightmap als Bild im speicher
  3. // Vertices sei ein 2-dimensionales Array für die Vertex-daten
  4. Vertex *vert;
  5.  
  6. int x,z;
  7. int i = 0;
  8. unsigned char buf;
  9. for(z=0;z<hightmap->h;z++)
  10. {
  11.     for(x=0;x<hightmap->w;x++)
  12.     {
  13.         vert = &Vertices[x][z];
  14.         vert->x = static_cast<float>(x);
  15.         buf = hightmap->pixels[i]; // den aktuellen grauwert auslesen
  16.         vert->y = buf * 0.5f; // die höhe wird skaliert, damits nicht zu hoch wird
  17.         vert->z = static_cast<float>(z);
  18.  
  19.         i += 3;
  20.     }
  21. }
  22.  


Ich würde allerdings empfehlen, die Hightmap nicht unbedingt als JPG oder so zu speichern, sondern als RAW, da sind die Farben dann nur mit jeweils einem Byte angegeben für den Grauwert (was ja reicht), es gibt keinen Dateiheader und man kann sich das durchaus auch mit einem entsprechenden Bildbetrachter anschaun (IrfanView kann das glaub ich).

Hoffe das hilft dir
Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 12:09 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
Hallo Leute,

erst einmal danke für die Infos.

Ich denke soweit ist das klar, und ich muß das einfach mal probieren. Ich habe es in gimp aber als Graustufenbild gespeichert, wird dann nicht jedes Pixel nur als 1 Byte gespeichert? Ist ja nicht als RGB (also Modus umgestellt, und als jpg gespeichert, ändert sich da was?)?

lg Darian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 12:11 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
eigentlich sollte jpg ein reines graustufenbild können. Aber wenn der loader nichts taugt, kann es passieren dass es doch wieder im speicher als 24bit vorliegt.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 12:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja JPEGs können definitiv Graustufen. Das ist sogar ein fundamentaler Bestandteil des Algorithmus. Vor einigen Tage hatte ich in einem anderem Thema da schon mal die Gelegenheit das näher zu betrachten. SDL_image ignoriert Graustufen und lädt es einfach als RGB. Obwohl so etwas auch durchaus mit der Formatbeschreibung des Surfaces machbar wäre. Finde ich persönlich irgendwie etwas dämlich und unbrauchbar.

Wenn es weiterhin direkt eine richtiges Bild sein soll, dann könntest du evtl mal ein 256 Farben BMP mit einer Farbpalette ausprobieren. Die Palette muss aber exakt mit den Werten der Graustufe zusammen passen. Allerdings ist das potentiell riskant, weswegen ich auch eher zu RAW tendieren würde. Bzw je nachdem was du später damit machen willst sind 256 Höhenunterschiede möglicherweise auch nicht ausreichen. Und wenn du dann 16 Bit pro Datenwert haben willst, dann dürften die meisten Bildformate schon alleine technisch nicht mehr in der Lage dazu sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 14:04 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
Ok verstehe, liegt also am IMG_Load. Ja, ich versuche ja mit Gimp ein .raw zu speichern, aber da muß ich erst ein Plugin suchen, vielleicht weiß ja zufälligerweise jemand was dazu.

Heißt es eigentlich Highmap, oder Heightmap, weil ich beides im Internet immer finde. Für mich kommt beides auf das gleiche, aber will lieber mal fragen, bevor ich mich irgendwo wegen meiner Unwissenheit lächerlich mache :-)

Würde IMG_Load bei ein .raw auch standardmässig als RGB laden, oder würde er da das mit den Graustufen kennen? (kann IMG_Load überhaupt .raw laden, weil es ja sicher nicht so Standard ist :-) Schließlich kann es Gimp auch nicht ohne Nachilfe)

Im Heightmap->pixels steht also alle Farbwerte in einem Array. Erste Pixelreihe von links nach rechts, zweite Pixelreihe von links nach rechts...usw
also zum Beispiel 200, 199, 150...usw und so könnte ich es einfach in einen zwei dimensionalen Array speichern (muß mich da in der SDL Doku noch schlauer machen, ich weiß :-)) In meinem derzeitigen fall sind eben noch für jeden Pixel 3 Werte gespeichert. (nachdem SDL immer RGB lädt)

Jedenfalls mal danke, jetzt kann ich mir das alles schon viel besser vorstellen, und wenn ich nicht auf ein Konzert fahren würde, würde ich mir das gleich genauer ansehen. (freue mich schon auf Morgen, wenn ich das probieren kann)

lg und danke für die Infos bis jetzt
Darian

P.S.: Wenn man sich besser mit dem Dateiformat beschäftigen würde, könnte man doch eigentlich auch relativ simpel einen eigenen TexturenLoader schreiben, oder? Hätte das von der Geschwindigkeit her Sinn, oder bewege mich mich da jetzt auf Gewässer die noch nichts für mich sind?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 07, 2007 15:41 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Es sollte die Heightmap sein.

Und wenn SDL_Image kein RAW kann:
Das RAW-Format ist so simple, da kannst du dir ohne Probleme einen eigenen Loader schreiben. Denn das erste in der Datei ist der erste Pixel, danach kommt der zweite etc. ;)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 08, 2007 23:23 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
Hallo,

ja danke für die Infos, habe jetzt versucht im Linux unter raw zu speichern, hat aber irgendwie nicht funktioniert. Gimp kann es nicht, die Plugins dafür können nur laden, nicht aber speichern, und sonst habe ich auch nichts brauchbares zum Arbeiten mit .raw gefunden.

Habe nun angefangen mit .bmp zu arbeiten. Ist auch passend für sowas? Es wurde ja schon was von Bitmap gesagt, aber das war mir nicht so ganz klar. Ich probiere es jetzt einfach einmal damit, und schreibe mir selbst einen Loader.

Aber ich mache schon Fortschritte, wird schon werden.

lg und thanks für die Infos
Darian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 09, 2007 15:49 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
@i0n0s

Muss nicht jedes Dateiformat was 2D Grafiken beschreibt irgendwie einen Header haben, auch das .raw?? Weil mindestens die Auflösung irgendwo beschrieben sein muß. Sonst kann man die Grafik ja nicht mehr richtig zusammen setzen.

Habe aber wie gesagt nichts über raw gefunden, was das geklärt hätte. Dachte ich mir einfach nur...

lg Darian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 09, 2007 18:37 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Nein, RAW hat sowas nicht, da muss man wissen was man hat. Aber normalerweise haben die Header, ja

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 09, 2007 23:44 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
.raw ist einfach nur ein Ausweg, wenn man eben gerade keine Infos über das Bild braucht sondern nur den rohen Datenteil speichern möchte. Folglich muss man beim Öffnen einer .raw Datei die fehlenden Angaben selber machen. Wenn du aber immer mit 512x512 RGB Texturen arbeiten willst kann es auch das Datenformat der Wahl für dich sein, weil du nur noch die Datei in den Speicher laden musst und OpenGL sie sofort wie sie ist als Textur verwenden kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 10, 2007 00:00 
Offline
DGL Member

Registriert: Fr Nov 23, 2007 00:02
Beiträge: 29
Hallo Leute,

dann ist das raw ja doch irgendwie ein sehr praktisches Dateiformat wenn man es gezielt einzusetzen weiß. Da ich hier im Linux aber leider keine Ahnung habe wie ich es so speichern kann. RAW kommt ja sonst von den Digicams. Mein Bildbearbeitungsprogramm Gimp, das ich hier benutzte kann es so nicht speichern, und probiere ich gerade es mit Bitmaps hin zu bekommen.

Obwohl vermutlich IMG_Load das schon können würde, interessiert mich jetzt das Thema mit dem eigenen reinladen von Bildern doch nocht sehr, dass ich es mir trotzdem selber ein bisschen schreiben werde.

Nur wie geht Bitmap mit Graustufenbilder um, sowas gibt es da nicht, oder? (zumindest habe ich da im wiki nichts rauslesen können)

lg
Darian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 10, 2007 00:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das BMP-Format unterstützt alle Bittiefen. 1, 4, 8, 16, 24 und 32-Bit, sogar mit RLE-Kompression. Alternativ kann man auch das TGA-Format nehmen, da man dies sehr leicht selber laden kann. Aber an sich ist (Speicherplatz mal Aussen vor) egal wie du die Heightmap abspeicherst, solange es kein Format mit verlustbehafteter Kompression ist.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 10, 2007 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Darian hat geschrieben:
RAW kommt ja sonst von den Digicams

Das ist zwar vom Prinzip her ähnlich aber solltest du bitte nicht gleich setzen. Bei dem "raw" wovon hier gesprochen wird/wurde handelt es sich lediglich um die Rohen Bilddaten. Vergleichbar mit einem unkomprimierten BMP ohne irgendwelche Zusatzinformationen. Das raw format einer Digicam speichert zwar auch die Bilddaten unkomprimiert allerdings sind diese Dateien wirklich komplexe Formate. Sie enthalten eine Fülle an Zusatzinformationen über die Kamera und deren aktuelle Einstellungen. Eine Wissenschaft für sich. ;)

Gimp und Graustufen: Habe gerade mal getestet, wenn man ein graustufen Bild mit Gimp als BMP speichert benutzt er automatisch eine Graustufenpalette. Und beim Laden merkt er das und öffnet es auch wieder als Graustufen. Kleveres kleines Kerlchen. :)

TGAs sind auch direkt in der Lage ein graustufen Bild abzuspeichern. Also es wird keine Farbpalette benötigt und der Header ist sehr sehr klein. Das kommt den Rohdaten wohl am Nächsten und hat noch genügend Zusatzinformationen um ein sinnvolles arbeiten in Gimp zu ermöglichen.

Das sinnvollste ist wohl, wenn du ein TGA nimmst und es selber einlist. Nicht mit SDL_image. Dazu brauchst du lediglich einen Header einlesen. Den findest du sowohl in meiner glBitmap als auch in der Textures.pas, usw. Und anschließend lädst du einfach die Daten (Höhe*Breite) des Bildes in einen Speicherbereich. Evtl solltest du nach dem Laden des Headers noch überprüfen ob die dort angegeben Werte auch alle richtig sind. Um missbruach zu vermeiden. Sonst gibts eigentlich nichts weiter zu tun.


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]