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

Aktuelle Zeit: Fr Jul 18, 2025 08:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Glättung von Gelände
BeitragVerfasst: So Okt 17, 2010 18:04 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

schon eine ganze weile arbeite ich an effizentem und gut aussehenden Terrain rendering aber heute ist mir was aufgefallen was mir so gar nicht gefällt

wenn man näher rangeht an das terrain bemerkt man das es wie aus kleinen treppen aufgebaut ist, das sieht aber wirklich doof aus und überhaupt nicht natürlich

im wikki hab ich was gelesen um formen zu krümmen, würde es damit gehen? meine sorge ist das ich adlig werde vor berechnungen die zu erledigen sind.

lg

Dateianhang:
nah drann.jpg
Dateianhang:
weit weg.jpg


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: So Okt 17, 2010 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du benutzt in deiner Heightmap sicher 256 Graustufen um die Höhe zu festzulegen. Damit hast du folglich auch nur 256 mögliche Höhenstufen was sich in dem beobachteten Treppeneffekt äußert. Abhilfe schafft da mehr Auflösung, z.B. eine 16bit Graustufen-Textur.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: So Okt 17, 2010 18:35 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ich erstelle meine heigthmaps alle mit L3DT ich dachte das macht sowas, kennst du ein prog das mir sowas erstellt? weil selbst mit photoshop(cs4) hab ich ja nur 255 farbstufen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: So Okt 17, 2010 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nun, auch wenn L3DT das kann musst du die Heightmap auch in einem Format speichern was 16bit Graustufen kann. Das wäre z.B. PNG. Des weiteren muss natürlich auch dein Texturlader damit klar kommen, hier hilft libpng weiter.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: So Okt 17, 2010 21:47 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
Problem scheint mir eher, dass du beim Zugriff auf die Heightmap nicht linear zwischen den Pixelwerten interpolierst oder hier den Fehler machst und wieder auf Bytes rundest: Erst hierdurch machen sich die 255 Abstufungen bemerkbar.

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Mo Okt 18, 2010 09:57 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
mein Texturzugriff erfolgt über die Textures.pas mit der ich meine bilder normalerweise aus einer TGA lade es ist aber auch kein problem auf png umzusteigen wenn das notwendig ist.

das bild dann intern verarbeiten erfolgt über den Terrainshader Coolcat

ich bin egrade noch in der schule werde mir aber heute abend das mal ansehen mit der png


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Mo Okt 18, 2010 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wenn ich den Wikipedia-Artikel richtig interpretiere kann TGA nur 8bit pro Farbkanal. Wenn es sich um diese Textures.pas handelt, dann kann diese nur GL_RGB oder GL_RGBA mit 8bit pro Farbkanal als interne Formate benutzen. Selbst wenn du bei 8bit bleibst ist das schlecht für Graustufenbilder, weil du drei mal mehr Grafikspeicher brauchst als eigentlich nötig. Du solltest z.B. GL_ALPHA16 als internes Format benutzen.

Des weiteren wird auch gluBuild2DMipmaps benutzt, was im OpenGL.org FAQ als "Never use this." markiert ist ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Mo Okt 18, 2010 17:09 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
och man ich hatte mich doch gerade damit angefreundet die unit war einfach, und hat verdammt nochmal genau das gemacht was sie sollte
"gibt mir das bild als textur" -> "da" -> "danke" :D

ok aber zu gunsten der speicherreduzierung und weil wir ja bisschen mit der zeit gehen wollen werd ich wohl umsteigen, ich hab mir jetzt erstmal die heigthmap als png erstellen lassen und auch überprüft ob es wirklich 16 bit sind jetzt gugg ich mir noch an wie ich das reinlade

€: ich hab weder die erweiterung für glbitmap.pas gefunden noch die libpng, die wenn dann nur als c++ code

ich hab auch schonmal von dem format .dds gehört was die glbitmat.pas ja auch laden kann, weiß einer was darüber ist das gut? lohnt das?

€2: hab mir gerade das plugin für photoshop gezogen aber dummerweise macht das einen komischen fehler beim speichern als .dds, schade eine 128bit textur wäre interressant gewesen^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dropye hat geschrieben:
weil selbst mit photoshop(cs4) hab ich ja nur 255 farbstufen

Dazu nur etwas am Rande. Selbst das abgespeckte 80€ teure Photoshop Elements kann mit 16 Bit Pro Kanal umgehen. Und die Versionen von Photoshop die ich von sehr viel Früher (12-14 Jahren) kenne konnten schon mit 32 Bits Pro Kanal umgehen. Ich weiß natürlich nicht wie das mit den Schülerversionen aktueller Software aussieht ob die viel beschnittener sind als die "großen". Meines Wissens nach unterscheiden die sich in solchen Dingen aber nicht. Und ich kann mir nur schwer vorstellen, dass die so etwas ausgebaut haben.

Zu den Treppchen. Vielleicht ist die Höhe nicht zu gering aufgelöst sondern die Heightmap von den Ausmaßen zu groß aufgelöst? Durch diese extremen Ausmaße würde die begrenzte Höhenauflösung (0-255) dafür sorgen, dass sich einige Werte wiederholen. Weil runde Flächen durchs Runden auf die gleichen Höhenwerte gezogen würden. Ich weiß ja nicht was du damit machen willst. Aber alternativ könnte es auch reichen die Auflösung der Heightmap um die Hälfte zu reduzieren. Dann hättest du zwar auch weniger Punkte aber je nach Ansicht (also was du damit plannst) würde es optisch keinen Unterschied machen. Die entstandenen Treppchen wären dann vermutlich auch verschwunden. Natürlich sollte auch 16 Bit Farbtiefe beim Generieren funktionieren. Wenn denn die Verarbeitung der Daten lückenlos funktioniert. Also ich meine wirklich jede Station (generieren, speichern, bearbeiten, speichern, laden, textur, shader) an der die Daten durchkommen.

Zum Texturenloader. glBitmap brauchst du gar nicht versuchen. Der kann auch keine 16 Bit Texturformate. Abgesehen davon verstehe ich deinen Satz überhaupt nicht. Total wirr für mich. Also wenn 16 Bit dann musst du selber hergehen und die Textur von Hand laden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 13:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
libpng, die wenn dann nur als c++ code

Nicht das ich das jetzt probiert hätte, aber: http://www.freepascal.org/packages/libpng.html
Übrigens hat libpng ein absolut hässliches imperatives C-Interface....kein objektorientiertes C++ ;)


Hier mein C++-Texturlader für PNG-Dateien mit libpng:
Code:
GLuint CUtil::loadTexturePng(const std::string filename, GLint genMipMaps, GLint magFilter, GLint minFilter) {
   if (filename == "") { return 0; }

   FILE* file = fopen(filename.c_str(), "rb");
   if (!file) {
      throw Exception("error while opening texture '" + filename + "'.");
   }
   png_byte header[9];
   bool is_png = (fread(header, 1, 8, file) == 8) && !png_sig_cmp(header, 0, 8);
   if (!is_png) {
      throw Exception("error while loading texture '" + filename + "'.");
   }

   // init libpng
   png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (!png_ptr) {
        throw Exception("error while loading texture '" + filename + "'. (png_create_read_struct)");
   }
    png_infop info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr) {
        png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
        throw Exception("error while loading texture '" + filename + "'. (png_create_info_struct)");
    }
   if (setjmp(png_jmpbuf(png_ptr))) {
      /* If we get here, we had a problem reading the file */
      fclose(file);
      png_destroy_write_struct(&png_ptr, &info_ptr);
      throw Exception("error while loading texture '" + filename + "'. (setjmp)");
   }
   
   png_init_io(png_ptr, file);
   png_set_sig_bytes(png_ptr, 8);
   
   png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_SWAP_ENDIAN, NULL);

   // retrieve image info
   png_uint_32 width, height, pxsize;
   int bit_depth, color_type;
   GLint intformat, extformat, exttype;
   png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);

   // choose texture format
   bool found = false;
   switch (color_type) {
      case PNG_COLOR_TYPE_GRAY: {
         switch (bit_depth) {
            case 8:
               pxsize = 1;
               intformat = GL_ALPHA8;
               extformat = GL_ALPHA;
               exttype = GL_UNSIGNED_BYTE;
               found = true; break;
            case 16:
               pxsize = 2;
               intformat = GL_ALPHA16;
               extformat = GL_ALPHA;
               exttype = GL_UNSIGNED_SHORT;
               found = true; break;
         }
         break;
      }
      case PNG_COLOR_TYPE_RGB: {
         switch (bit_depth) {
            case 8:
               pxsize = 3;
               intformat = GL_RGB8;
               extformat = GL_RGB;
               exttype = GL_UNSIGNED_BYTE;
               found = true; break;
            case 16:
               pxsize = 6;
               intformat = GL_RGB16;
               extformat = GL_RGB;
               exttype = GL_UNSIGNED_SHORT;
               found = true; break;
         }
         break;
      }
      case PNG_COLOR_TYPE_RGBA: {
         switch (bit_depth) {
            case 8:
               pxsize = 4;
               intformat = GL_RGBA8;
               extformat = GL_RGBA;
               exttype = GL_UNSIGNED_BYTE;
               found = true; break;
            case 16:
               pxsize = 8;
               intformat = GL_RGBA16;
               extformat = GL_RGBA;
               exttype = GL_UNSIGNED_SHORT;
               found = true; break;
         }
         break;
      }
   }
   if (!found) {
      throw Exception("unsupported format in texture '" + filename + "'. ");
   }
   
   // load image data
   unsigned int rowbytes = width*pxsize;
   png_bytepp data_rows = (png_bytepp)png_get_rows(png_ptr, info_ptr);
   png_byte* data = new png_byte[height*rowbytes];
   // copy row per row into data
   png_byte* dest = data;
   for (unsigned int y=0; y<height; y++) {
      png_byte* source = data_rows[y];
      png_byte* end = dest + rowbytes;
      while (dest<end) {
         *(dest++) = *(source++);
      }
   }
   // generate texture
   GLuint tex;
   glGenTextures(1, &tex);
   glBindTexture(GL_TEXTURE_2D, tex);
   glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, genMipMaps);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16);
   glTexImage2D(GL_TEXTURE_2D, 0, intformat, width, height, 0, extformat, exttype, data);
   // clean up
   png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
   fclose(file);
   delete[] data;
   DEBUG_GL_ERROR;
   return tex;
}

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 19:14 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
@ Lossy eX:

ich hab keine schülerversion sondern ne vollwertige :D und nein die is nicht illegal geklaut gezogen oder sonstwas

und dann zu den 16 bit, ich hab immer das problem sobald ich die 16bit datei die ich ja als png gespeichert habe irgendwo reinlade (photoshop, xnview) wird sie immer auf 8bit reduziert, keine ahnung warum

und du meinst wenn ich kleinere texturen nutze also Mosaik dann gehen die treppen auch weg?


@ Coolcat

auch auf der seite die du gepostet hast ann ich nicht die lib laden sondern nur komplett freepascal in der dann die lib denke ich enthalten ist, aber naja was tut man nicht alles ich werd mir das wohl im ganzen ziehen nd dann das raussuchen was ich benötige


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
aber naja was tut man nicht alles ich werd mir das wohl im ganzen ziehen nd dann das raussuchen was ich benötige

Das war einfach nur der erste Google-Treffer zu "libpng pascal". Bevor du da zu viel Zeit reinsteckst, ggf. erstmal was genauer suchen, z.B. hier: http://www.libpng.org/pub/png/pngaptk.html
Zitat:
Delphi [Borland] (Win32) - version 6 and later; read/write; commercial/freeware. (Delphi's native PNG support is available via CLX only; the older VCL component library doesn't support it.)
...
GraphicEx [Mike Lischke] (Win32) - version 8.0 and later; read-only; includes a Pascal port of zlib; freeware for non-commercial use, with source. (This is a Delphi [Pascal] extension to load various image formats, including PNG.)

Ob das jetzt 16bit Farbkanäle einschließt steht da natürlich nicht.

Übrigens eine alternative Lösung wäre noch die 16bit einfach in zwei 8bit Kanäle zu codieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was war nochmal der Grund gegen glBitmap.pas …?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
@Lord Horazont:
Lossy eX hat geschrieben:
glBitmap brauchst du gar nicht versuchen. Der kann auch keine 16 Bit Texturformate

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Glättung von Gelände
BeitragVerfasst: Di Okt 19, 2010 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Coolcat hat geschrieben:
@Lord Horazont:
Lossy eX hat geschrieben:
glBitmap brauchst du gar nicht versuchen. Der kann auch keine 16 Bit Texturformate

Verdammt, nichts für ungut …

Du benutzt nicht zufällig FreePascal? Dann könntest du die langsame, aber fähige, fpImage-Bibliothek ausprobieren.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 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.016s | 17 Queries | GZIP : On ]