# OpenGL + glSubTexImage2D -> Bufferproblem



## Kr0e (19. Mai 2011)

Hallo Zusammen,

ich habe ein kleines Problem:

Ich will folgende Funktion ganzgern verwenden: 

        GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
                GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, directBuffer);

Mein Problem ist, dass die Koordinatenangabe "x,y,w,h" sich auf die Zieltextur bezieht und nicht auf den Buffer. 

"directBuffer" ist in meinem Fall immer ein gleichgroßer Buffer, allerdings werden hin und wieder halt nur bestimmte Teile in diesem Buffer aktualisiert, wodurch ich auch nur diese bestimmten Bereiche updaten will. Nun interpretiert OpenGL leider die Übergabe des 
buffers als vollständige Datenquelle für den Bereich x,y,w,h. Das ist natürlich nicht gewollt....

Kann man OpenGL iwie mitteilen, dass der buffer "so und so groß ist" und OpenGL sich das selbst rauskopieren soll ? Ich will das ungern mit Java machen, da solche Kopieraktionen viel Overhead benötigen, außerdem müsste der DirectBuffer erstmal in die JVM kopiert werden was SUPER ineffizient wäre...Bei Bildern von 1024*1024 z.B. bekommt man das nicht mehr mit vernünftigen FPS-Raten hin..

Danke schonmal !

Gruß,

Chris


----------



## Kr0e (19. Mai 2011)

Vlt. mal eben zur genaueres Erklärung:


```
directBuffer.clear();

        //Ich will den folgenden Algorithmus gerne hardwarebeschleunigt von OGL lösen lassen... Geht daS ?
        for (int i = y; i < y + h; i++) {
            for (int j = x; j < x + w; j++) {
                directBuffer.put(data.get(i * width + j));
            }
        }
        directBuffer.flip();

        GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
                GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, directBuffer);
```

Beim Durchstöbern von anderen Frameworks kam hin und wieder mal glPixelstorei vor... Ginge es vlt damit ?


----------



## Guest2 (19. Mai 2011)

Moin,



Kr0e hat gesagt.:


> Beim Durchstöbern von anderen Frameworks kam hin und wieder mal glPixelstorei vor... Ginge es vlt damit ?



imho ja. Mit glPixelStore und jeweils den Parametern GL_UNPACK_ROW_LENGTH und GL_UNPACK_SKIP_PIXELS sollte sich das eigentlich bewerkstelligen lassen.

Viele Grüße,
Fancy


----------



## Kr0e (19. Mai 2011)

Danke sehr!

Hiermit gehts nun =)


```
int rowLength = GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH);
        int skipRows = GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS);
        int skipPixels = GL11.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS);

        GL11.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, newRowLength);
        GL11.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, x);
        GL11.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, y);

        GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
                GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, data);

        GL11.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, rowLength);
        GL11.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, skipRows);
        GL11.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, skipPixels);
```


----------

