pixel auslesen in JOGLE

  • Themenstarter Themenstarter Melkor
  • Beginndatum Beginndatum
M

Melkor

Gast
Hallo,

ich möchte aus einem OpenGL Fenster einen Ausschnitt vom Framebuffer auslesen mit glReadPixels. Der Ausschnitt im Fenster wird durch minx, miny, maxx, maxy repräsentiert. Es funktioniert... fasst.

Es wird zwar ein Bereich ausgelesen, aber scheinbar liegt bei den y-Koordinaten ein Problem vor, da nur ein verschoebenr, zu kleiner Berech typischerweise kopiert wird. Ich glaube es könnte damit zusammen hängen, dass der viewport anders herum ausgerichtet ist, aber ich weiss nicht wie ich die Parameter setzen muss und war recht erfolglos bei der Suche...


Java:
    int w = maxx - minx;
    int h = maxy - miny;
    int total = w * h;
    // szene rendern    
    ByteBuffer buffer = Buffers.newDirectByteBuffer(total * 3);
    gl.glReadPixels(minx, viewport[3] - maxy, w, h, GL.GL_RGB, GL.GL_BYTE, buffer);
    for (int i = 0; i < total; i += 3) {
      byte r = buffer.get(i + 0);
      byte g = buffer.get(i + 1);
      byte b = buffer.get(i + 2);
      // ...
    }
 
Nachtrag:

Ich denke es sollte so heißen:
Java:
gl.glReadPixels(minx, viewport[3] - h - miny, w, h, GL.GL_RGB, GL.GL_BYTE, buffer);

Nur klappt erst dann, wenn ich die variable total sehr hoch setzte, z.b.: int total = viewport[2] * viewport[3] * 3;

Irgendwas scheine ich nicht verstanden zu haben. Warm muss dieser Wert so groß sein? Wie gehts richtig?
 
Hallo nochmal,
vielleicht anders gefragt:

wenn ich von einer Pixel Position aus v Pixel-Spalten und h Pixel-Reihen auslesen will mit readPixels im RGB Format, welche Größe muss mein Buffer haben? h*w*3 scheint zu wenig zu sein, nur warum?
 
Moin,

Du gibst als Typ GL_BYTE an, der default für das pack alignment ist aber (imho) 4 Byte. Du bräuchtest also 4 * 3 * w * h Bytes. Du solltest das umgehen können, indem Du das pack alignment änderst ([c]glPixelStoref(GL_PACK_ALIGNMENT, 1)[/c]).

Imho ist der empfohlene Typ [c]glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);[/c]. Dann muss der Speicher 4 * w * h groß sein.

Viele Grüße,
Fancy
 

Neue Themen


Zurück
Oben