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

Aktuelle Zeit: Mi Mai 15, 2024 00:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Apr 25, 2014 21:46 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Moin zusammen.
Ich versuche gerade per SDL_TTF2 einen Text zu rendern und ihn anschließend in eine OpenGL Texture zu laden. Leider klappt das nicht ganz.
Ich möchte einen Textue mit roten Hintergrund (zu Testzwecken) haben, bekomme allerdings eine mit Blauen Hintergrund. Speichere ich vor der Konvertierung in eine OpenGL Texture die SDL_Surface, sehe ich noch korrekterweise ein Bild mit roten Hintergrund.
Hier einmal die beiden Bilder:
Rot (wie es sein soll und als SDL_Surface auch ist):
Bild
Blau (wie es ist als OpenGL Texture):
Bild

Meine render Funktion:
Code:
  1.  
  2.     Surface Font::render(const std::string& text, Color* fg, Color* bg, Mode mode) const {
  3.         SDL_Color _fg;
  4.         SDL_Color _bg;
  5.  
  6.         Color::Copy(fg, _fg, Color::Black);
  7.         Color::Copy(bg, _bg, Color::White);
  8.  
  9.         SDL_Surface* srfc = nullptr;
  10.         switch (mode) {
  11.             case Mode::Solid:
  12.                 srfc = TTF_RenderUTF8_Solid(_ttf, text.c_str(), _fg);
  13.                 printf("SOLID\n");
  14.                 break;
  15.             case Mode::Shaded:
  16.                 srfc = TTF_RenderUTF8_Shaded(_ttf, text.c_str(), _fg, _bg);
  17.                 printf("Shaded\n");
  18.                 break;
  19.             case Mode::Blended:
  20.                 srfc = TTF_RenderUTF8_Blended(_ttf, text.c_str(), _fg);
  21.                 printf("Blended\n");
  22.                 break;
  23.         }
  24.  
  25.         if (srfc == nullptr) {
  26.             printf("NULL Surface: %s\n", SDL_GetError());
  27.             exit(1);
  28.         }
  29.  
  30.         if (srfc->format->BitsPerPixel < 24) {
  31.             SDL_PixelFormat fmt = *srfc->format;
  32.             fmt.BitsPerPixel = 24;
  33.  
  34.             SDL_Surface* new_srfc = SDL_ConvertSurface(srfc, &fmt, 0);
  35.             SDL_FreeSurface(srfc);
  36.  
  37.             if (new_srfc == nullptr) {
  38.                 printf("NULL Surface (convert): %s\n", SDL_GetError());
  39.                 exit(1);
  40.             }
  41.  
  42.             return Surface(new_srfc);
  43.         }
  44.  
  45.         return Surface(srfc);
  46.     }
  47.  


Font ist ein Wrapper um SDL_TTF2, Surface ein Wrapper um SDL_Surface.

Meine Konvertierungsfunktion:
Code:
  1.  
  2. Surface srfc = font.render(_text, &this->fg, &this->bg, mode); /// Aufruf der render Funktion
  3. _texture->loadFrom(srfc); /// Die Texture lädt die SDL_Surface
  4. srfc.saveToFile(_text + ".png"); /// Das liefert das korrekte Bild
  5.  


Sowie der "loadFrom" Aufruf von der Texture Klasse:
Code:
  1.  
  2.     void Texture::loadFrom(const Surface& srfc, Format format) {
  3.         if (format == Format::None) {
  4.             if (srfc.isMask(Surface::Mask::Red, 0xff000000))
  5.                 format = srfc.bits() == 32 ? Format::BGRA : Format::BGR;
  6.             else
  7.                 format = srfc.bits() == 32 ? Format::RGBA : Format::RGB;
  8.  
  9.             printf("Bits = %d, %d\n", srfc.bits(), srfc.isMask(Surface::Mask::Red, 0xff000000));
  10.         }
  11.        
  12.         this->loadFromMemory(srfc.pixels(), srfc.width(), srfc.height(), format);
  13.     }
  14.  
  15.     void Texture::loadFromMemory(const void* pixels, uint16 width, uint16 height, Format fmt) {
  16.         _format = fmt == Format::None ? Format::RGB : fmt;
  17.  
  18.         this->bind();
  19.  
  20.         const GLenum gl_fmt = static_cast<GLenum>(_format);
  21.  
  22.         glCheck(glBindTexture(GL_TEXTURE_2D, _texId));
  23.         glCheck(glTexImage2D(GL_TEXTURE_2D, 0, gl_fmt, width, height, 0, gl_fmt, GL_UNSIGNED_BYTE, pixels));
  24.         glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, this->repeat ? GL_REPEAT : GL_CLAMP));
  25.         glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, this->repeat ? GL_REPEAT : GL_CLAMP));
  26.         glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, this->smooth ? GL_LINEAR : GL_NEAREST));
  27.         glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, this->smooth ? GL_LINEAR : GL_NEAREST));
  28.  
  29.         _width = width;
  30.         _height = height;
  31.  
  32.         this->unbind();
  33.     }
  34.  


Mein OpenGL Blending ist gegeben durch:
Code:
  1.  
  2. glEnable(GL_BLEND);
  3. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  4.  


Das bemerkenswerte: Ändere ich bei der render Funktion die 24 ( fmt.BitsPerPixel = 24;) in eine 32, sehe ich gar nichts mehr, als wäre das Bild völlig transparent.

Ändere ich manuell das Format auf bspw BGR oder ähnliches ab, bekomme ich nur Datenmüll ausgegeben.
Kann mir einer sagen, wieso das Rot zu Blau wird? Probiere ich es genau umgekehrt, also möchte einen blauen Hintergrund haben, bekomme ich natürlich einen roten. Was läuft da verkehrt? O.o


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 25, 2014 22:11 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich korrigiere: Wenn ich manuell das Format auf BGR festlege (was ja erklären könnte, warum Rot zu Blau wird) dann stürzt das Programm mit einer Zugriffsverletzung ab.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 25, 2014 22:36 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich mag dieses Forum. Ich kann den ganzen Tag nach dem Fehler suchen aber kaum poste ich hier finde ich es selbst:
Code:
  1.  
  2. glCheck(glTexImage2D(GL_TEXTURE_2D, 0, gl_fmt, width, height, 0, gl_fmt, GL_UNSIGNED_BYTE, pixels));
  3.  

Muss in
Code:
  1.  
  2. glCheck(glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, gl_fmt, GL_UNSIGNED_BYTE, pixels));
  3.  

geändert werden. Zusätzlich noch manuell das Format auf BGR legen und es funktioniert. :)


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


Wer ist online?

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