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

Aktuelle Zeit: Di Mai 14, 2024 22:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Mär 17, 2013 15:47 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ich bin momentan an einem Fontrenderingsystem in C++ auf Basis von Freetype dran.
Eigentlich funktioniert auch das meiste schon prächtig, aber die hochgeladen Buchstabentexturen sind teilweise verzerrt. Genauer gesagt unterschiedlich stark nach oben rechts geschert, wobei die Pixel die links fehlen wieder rechts hereinkommen und anders herum.

Der Code um die Textur(Größe: 4096²) zu Erstellen sieht so aus...
Zitat:
FontManagementTexture* MTex = new FontManagementTexture(new RectPacker<int>(Size), true);
this->Textures.push_back(MTex);

glGenTextures(1, &(MTex->ID));

glBindTexture(GL_TEXTURE_2D, MTex->ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
//GL_R3_G3_B2, GL_RGB, GL_RGB4, GL_RGB5, 3
//GL_LUMINANCE4, GL_LUMINANCE8, 1
glTexImage2D(GL_TEXTURE_2D, 0, Subpixel ? GL_RGB5 : GL_LUMINANCE4, Size.X, Size.Y, 0, Subpixel ? GL_RGB : GL_LUMINANCE, GL_UNSIGNED_BYTE, 0); // Subpixel ist immer aus...

GLCSHOWERROR();


Und der Code um die Buchstabenbitmaps in die große OpenGL Textur zu laden...
Code:
  1. Rect<int>& TexArea = MTex_.Packer->operator[](MLetter.RectID).Rect;
  2. const char* BmpFilename = (string("..\\test") + StringConv<int>::ToString(i++) + ".bmp").c_str();
  3. SOIL_save_image(BmpFilename, SOIL_SAVE_TYPE_BMP, TexArea.X2 - TexArea.X1, TexArea.Y2 - TexArea.Y1, 1, MLetter.BmpPixels);
  4. glTexSubImage2D(GL_TEXTURE_2D, 0, TexArea.X1, TexArea.Y1, TexArea.X2 - TexArea.X1, TexArea.Y2 - TexArea.Y1, MLetter.BmpColored ? GL_RGB : GL_LUMINANCE, GL_UNSIGNED_BYTE, MLetter.BmpPixels);


Da ich wie man hier sieht die einzelnen Buchstaben testweise als Bmp ausgebe und dort keine Fehler zu sehen sind, vermute ich stark ein Problem bei "glTexSubImage2D". Die Buchstaben wie sie sein sollten habe ich auch mal angehängt.
Wenn ich nämlich unmittelbar danach den Texturinhalt wieder auslesen lasse, dann ist der Fehler bereits da.
So hole ich den Textureninhalt wieder von der Grafikkarte...
Code:
  1. unsigned char* TexData = new unsigned char[4096*4096];
  2. glGetTexImage(GL_TEXTURE_2D, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, TexData);
  3. SOIL_save_image("..\\testcomplete.bmp", SOIL_SAVE_TYPE_BMP, 4096, 4096, 1, TexData);
  4. GLCSHOWERROR();

Das Problem tritt unverändert auch auf, wenn man eine kleinere Fonttextur anlegt.

(Crosspost zu http://www.spieleprogrammierer.de/15-2d ... 2d-sorgt-für-texturverzerrungen)


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 18, 2013 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Ich hätte (wie schon im anderen Thread vermutet) alle Lese- und Schreibformate einheitlich (zB. auf RGB) gesetzt. Was mit auffällt ist, dass die Verschiebung direkt in der ersten Zeile einsetzt und dann konstant bleibt (bei falscher Breitenangabe würde es sich nach unten hin weiter verschieben). Eventuell zeigt, MLetter.BmpPixels nicht direkt auf die Pixeldaten, sondern enthält noch Headerdaten? Zuletzt sieht man, dass verschiedene Buchstaben richtig angezeigt werden. Hast du schon einmal probiert die Reihenfolge bei der Erzeugung zu tauschen oder die Positionen zu verändern? Sonnst sieht der gegebene Code für mich fehlerfrei aus.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 18, 2013 15:32 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Erstmal danke dafür das du dich mit dem Problem kurz befasst hast. :D

Zitat:
Ich hätte (wie schon im anderen Thread vermutet) alle Lese- und Schreibformate einheitlich (zB. auf RGB) gesetzt.

Das Lese- und Schreibformate ist immer GL_LUMINANCE4 bzw. GL_LUMINANCE.
Wie ich auf sppro schon geschrieben habe...
"Wenn ich GL_LUMINANCE8 oder einfach "1" (für einen Kannal) angebe ändert sich am Ergebnis nichts sichtbar. (Gleiche Fehler bei gleichen Buchstaben und gleiche Verzerrung)"

Zitat:
Was mit auffällt ist, dass die Verschiebung direkt in der ersten Zeile einsetzt und dann konstant bleibt

Ich verstehe ehrlichgesagt nicht ganz was du meinst.
Beispiel:
Code:
  1. 00XX00
  2. 00XX00
  3. 000000
  4. 00XX00
  5. 00XX00
  6. 00XX00
  7. 00XX00

Wenn man die Breite dieses "i" falsch einstellt, kommt es doch zu genau der Verschiebung. (Beispielhaft)
Code:
  1. 00XX0
  2. 000XX
  3. 00000
  4. 00000
  5. XX000
  6. 0XX00
  7. 00XX0
  8. 000XX
  9. 00


Zitat:
Eventuell zeigt, MLetter.BmpPixels nicht direkt auf die Pixeldaten, sondern enthält noch Headerdaten?

Eigentlich auszuschliessen weil ich die Daten selber von Hand umkopiere und neu ausrichte ohne einen evt. Header zu beachten. Das die Buchstabenbitmaps nicht falsch sind, zeigt mir eigentlich die Ausgabe in die Datei. Auch steht in der Freetypedokumentation nirgens etwas davon und es wäre auch nicht sinnvoll bei gerenderten Freetypebuchstaben noch einen Header voranzustellen.

Zitat:
Hast du schon einmal probiert die Reihenfolge bei der Erzeugung zu tauschen oder die Positionen zu verändern?

Ja, siehe Anhang.
Es scheint, das die Fehler bei den gleichen Buchstaben auftreten.

Zitat:
Sonnst sieht der gegebene Code für mich fehlerfrei aus.

Wenn weiterer Code vlt weiterhilft, kann ich auch noch mehr liefern.
Die ganze Klasse ist aber über 700 Zeilen lang und damit etwas zu lang um ihn einfach so im Forum zu posten.


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 18, 2013 20:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
siehst du einen unterschied mit und ohne glFinish?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 19, 2013 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dein Problem liegt wohl vermutlich daran, dass OpenGL für die Pixeldaten ein Alignment erwarten. Also, dass die Bilddaten nicht alle an einem Stück liegen sondern die Anfänge der Zeilen an einer 4 Byte Grenze ausgerichtet sind. Dadurch werden am Ende Spacerbytes eingefügt. Bzw in deinem Fall erwartet OpenGL wohl diese Bytes. Aber sie stecken nicht in den Daten. Weswegen deine Buchstaben nach Links geneigt (von oben nach unten betrachtet) sind.

Um das einzustellen gibt es die Funktion glPixelStorei. Mit dem Parameter GL_UNPACK_ALIGNMENT zum Transfer von Daten nach OpenGL. Und GL_PACK_ALIGNMENT zum Transfer von OpenGL zur Anwendung.

Ich meine der Default für das Alignment liegt bei 4 Bytes. Das müsstest du entweder auf 1 setzen oder auf 4. Je nachdem, ob dein Dateiloader diese Bytes mit durchschleift oder nicht. Wenn der mehr als nur BMPs macht (die immer ein Align von 4 Bytes haben), dann werden die Spacer wohl nicht mit durchschleifen. Von daher tippe ich sehr stakt auf 1. Alleine auch wegen der Neigung der Buchstaben. Das spricht dafür, dass am Ende einer jeden Zeile 1-2 Bytes fehlen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 19, 2013 22:42 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ok, vielen vielen Dank für den Tipp!!
Das Alignment war Schuld, nach "glPixelStorei(GL_UNPACK_ALIGNMENT, 1);" läuft alles rund. :D


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


Wer ist online?

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