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 ?


  • Mod

    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öst 😃

    Die 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.


Anmelden zum Antworten