Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.06.2010, 11:17

Textur auf festplatte speichern

Hallo,

wenn ich eine Szene in eine Textur zeichne (z.B. bei der Shadow-Map Erzeugung), sodass sie in irgendeinem Texturspeicher rumliegt, wie kriege ich den mit OpenGL dann auf die Festplatte geschrieben, sodass man das ganze in irgendeinem Bildformat (bmp, jpg, tga) hat?

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

14.06.2010, 11:36

Wohl genauso wie du Texturen reinladen kannst nur umgekehrt ^^
OpenGL erlaubt es dir ja die Textur zu locken und dann auszulesen. Bin jetzt in OpenGL nicht so sehr bewandert, daher kann ich dir nicht genau sagen wie das von statten geht (da meldet sich sicher noch jemand). Um in eines der von dir genannten Formate zu speichern müsstest du dir entweder deren Spezifikationen anschauen oder eine Library verwenden, die dir aus den Farbdaten ein entsprechende Format zusammensetzen kann. (bmp sollte kein allzu großes Problem sein; jpg wird schwieriger und bei tga bin ich mir nicht sicher)

EDIT: Daskönnte dir vllt auch noch weiterhelfen - btw. das erste Google Ergebnis für "opengl save texture" :P

3

14.06.2010, 11:57

Ich hab sowas mal gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void SaveTextureToPNG(GLuint Texture, std::string Filename)
{
    glBindTexture(GL_TEXTURE_2D, Texture);

    Vector2i TexSize;
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &TexSize.y);
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &TexSize.x);


    std::vector<unsigned char> TexData, PngData;

    int Pack;
    glGetIntegerv(GL_PACK_ALIGNMENT, &Pack);
    TexData.resize(TexSize.x*TexSize.y*4);

    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &TexData[0]);

    LodePNG::Encoder encoder;
    encoder.encode(PngData, TexData, TexSize.x, TexSize.y);
    LodePNG::saveFile(PngData, Filename);
}

Um die Textur zu erzeugen hab ich picopng benutzt, dazu findet man hier was.
Das betrifft aber nur die 3 letzten Zeilen, der kram davor ist dafür da, um die Textur in ein Byte Array (hier ein std::vector) zu kriegen.Man kann dann auch z.B. DevIL benutzen, um die Daten als beleibige Bilddatei zu speichern.
Was die einzelnen glFunktionen machen dürftest du recht schnell ergoogeln können.
Lieber dumm fragen, als dumm bleiben!

4

14.06.2010, 17:32

Besten Dank, ich schaus mir mal an

Werbeanzeige

Ähnliche Themen