# pixel auslesen in JOGLE



## Melkor (21. Sep 2012)

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



```
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);
      // ...
    }
```


----------



## Melkor (21. Sep 2012)

Nachtrag:

Ich denke es sollte so heißen:

```
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?


----------



## Melkor (24. Sep 2012)

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?


----------



## Guest2 (24. Sep 2012)

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


----------

