OpenGL Screenshot geht nicht
-
Hi Leute
Habe ein komisches Phänomen mit einer Screenshot-Funktion für ein OpenGL Fenster. Ich benutze folgenden Code um einen Screenshot im .raw Format zu machen:
long nRawSize = nChannels * Width * Height; BYTE* image = new BYTE[nRawSize]; glReadPixels(0, 0, Width - 1, Height - 1, GL_RGB, GL_UNSIGNED_BYTE, image); CString szFilename; szFilename.Format("c:\\output\\test%d.raw", x); CStdioFile OutFile; if (OutFile.Open(szFilename, CFile::modeCreate | CFile::modeWrite)) { OutFile.Write(image, nRawSize); OutFile.Close(); } delete[] image;
Das funktioniert super und die Bilder sind einwandfrei in Ordnung, allerdings nur so lange bis ich in meiner OpenGL Szene Material-Eigenschaften verwende.
Dann kommt nur Pixelmüll raus
Die Umrisse der Szene lassen sich noch einigermaßen erkennen, aber die Farben sind völlig durcheinander und das Bild ist leicht verzerrt. Was verändert sich im Frame-Buffer, wenn ich Materialien verwende ? Kann es damit zusammenhängen, das mein Pixelformat-Deskriptor auf GL_RGBA steht und ich GL_RGB auslese ? Wenn ja: Wieso geht es ohne Materialien ?
-
vor glReadPixels mußt du noch die ganzen formateinstellungen setzen, die du im material vielleicht kaputtmachst... ich weiß aber nicht auswendig welche das sind
rapso->greets();
-
Hmmm, Format von was ?
(edit)
Problem gelöstDie Ausgabedatei muss im Binärmodus geöffnet werden, dann klappts auch mitm Screenshot. Ich habe allerdings keinen blassen schimmer, warum das in dem Fall ausgerechnet bei Materialien ein Problem gibt
-
Ein Erklärungsversuch:
Ohne Material werden bestimmten Farben erzeugt. Keine der Farben enthält in der binären Codierung '\n' und '\r'. Beim Speichern im Textmodus geht nichtskaputt. Mit Matreial werden andere Farben erzeugt. Einige dieser enthalten '\n' oder '\r'. Beim Speichern werden hier einzelne Bytes eingefügt, was zu einer Verschiebung der Kanäle führt.RGBRGBRGBRGBRGBRGBRGB RGBRGBRGBRGBxRGBRGBRGB ^ ^ korrekt falsch G=R usw.
Bye, TGGC (Der Held lebt!)
-
Ja hast recht, die geschrottete Datei ist auch etwas länger als sie sein sollte.