# OpenGL glDrawArrays Bufferfehler



## TheWhiteShadow (31. Mai 2012)

Hallo,
ich versuche nach der Anleitung hier OpenGL Vertex Array
mich in die Materie einzuarbeiten, aber irgendwie klappt das nicht so ganz.
Die VM crashed, weil mein Buffer nicht stimmt, aber was ist daran falsch?

Mein Zeichenaufruf:

```
float[] vertices = new float[] {-size, -size, size,
								 size, -size, size,
								 size,  size, size,
								-size,  size, size};
// 4*3*4 = (float) * (Vertices) * (Polygonform)
FloatBuffer floats = ByteBuffer.allocateDirect(4 * 3 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
floats.put(vertices);
floats.flip();

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, floats);
glDrawArrays(GL_QUADS, 0, 4); // hier wills nicht mehr!
glDisableClientState(GL_VERTEX_ARRAY);
```

Ich hatte vorher die Vertex über glBegin ... gemacht, und nur diese eine Methode geändert.


----------



## Guest2 (1. Jun 2012)

Moin,

Du könntest probeweise mal dieses versuchen:


```
// GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
            // GL11.glVertexPointer(3, GL11.GL_FLOAT, floats);
            GL11.glInterleavedArrays(GL11.GL_V3F, 0, floats);
            GL11.glDrawArrays(GL11.GL_QUADS, 0, 4);
            // GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
```

Viele Grüße,
Fancy


----------



## Spacerat (1. Jun 2012)

Soweit ich das überblicke will "glDrawArrays" bei dir 4 Quads statt 4 Punkte zeichnen. Der Parameter Count müsste 1 sein und nicht 4.


----------



## TheWhiteShadow (4. Jun 2012)

Das mit dem Parameter glDrawArrays hab ich schon ausprobiert. Wenn ich ihn höher drehe crashed es seltener, irgendwann gar nicht mehr aber ich seh meine Form nicht. Diese muss aber da sein, weil es dieselben Koordinaten sind, wie zuvor.

glInterleavedArrays funktioniert. Warum weiß ich zwar nicht, aber ich ich les mich mal ein.^^

Danke und Gruß TWS


----------



## Guest2 (4. Jun 2012)

TheWhiteShadow hat gesagt.:


> glInterleavedArrays funktioniert. Warum weiß ich zwar nicht, aber ich ich les mich mal ein.^^



Imho könnte das auch ein Bug im OpenGL Treiber sein. Mir ist dieses merkwürdige Verhalten auch erst vor einiger Zeit aufgefallen. Nutzt Du zufällig eine ATI mit aktuellem Treiber? (Da trat das Verhalten bei mir auf, allerdings nicht immer reproduzierbar)

Viele Grüße,
Fancy


----------



## TheWhiteShadow (6. Jun 2012)

Ich habs den Fehler mittlerweile gefunden.

glVertexPointer will als 2. Parameter kein Typ sondern den Abstand zum nächsten Punkt in bytes haben.^^
glDrawArrays will die Bufferlänge in floats haben.


----------



## Guest2 (6. Jun 2012)

Ups, das mit dem [c]glVertexPointer[/c] habe ich in deinem Beispiel tatsächlich übersehen. Normalerweise hat [c]glVertexPointer[/c] 4 Parameter (OpenGL: glVertexPointer). In LWJGL wird auf den zweiten Parameter verzichtet, da die Methode 5 fach überladen ist und sich der Typ aus dem Buffer ergibt. Als stride (2 Parameter bei LWJGL, 3 Parameter bei OpenGL) kannst Du auch 0 angeben, dann wird davon ausgegangen das alle Werte hintereinander liegen.

Bei [c]glDrawArrays[/c] sollte der 3 Parameter count allerdings sowohl bei LWJGL als auch bei OpenGL die Anzahl der Indizes angeben. Bei einem Quad sollte 4 also richtig sein (OpenGL: glDrawArrays).

Viele Grüße,
Fancy


----------



## Spacerat (6. Jun 2012)

Guest2 hat gesagt.:


> Bei [c]glDrawArrays[/c] sollte der 3 Parameter count allerdings sowohl bei LWJGL als auch bei OpenGL die Anzahl der Indizes angeben. Bei einem Quad sollte 4 also richtig sein (OpenGL: glDrawArrays).
> 
> Viele Grüße,
> Fancy


Der Link ist sehr aufschlussreich. Hmm, nö, eigentlich gar nicht. Ist bei "count" die Anzahl der Indices gemeint, die ein Quad als Punkte oder die Anzahl der Indices die das Array an Quads hat, gemeint? Ich denke nämlich eher das Zweite, weil die Anzahl der Punkte pro Quad bereits durch "GL_QUAD" vorgegeben ist.


----------



## Guest2 (6. Jun 2012)

Bei einem Quad als GL_QUADS 4. Bei zwei Quads als GL_QUADS 8 usw.
Bei einem Quad als GL_QUAD_STRIP 4. Bei zwei Quads als GL_QUAD_STRIP  6 usw.
Bei einem Dreieck als GL_TRIANGLES 3. Bei zwei Dreiecken als GL_TRIANGLES 6 usw.
Bei einem Dreieck als GL_TRIANGLE_STRIP 3. Bei zwei Dreiecken als GL_TRIANGLE_STRIP 4 usw.
Bei einem Dreieck als GL_TRIANGLES_ADJACENCY 6. Bei zwei Dreiecken als GL_TRIANGLES_ADJACENCY 12 usw.

Und viele weite Möglichkeiten. 

Du kannst das auch mit dem Beispiel oben ausprobieren. Ab count = 4 wird das Quad korrekt dargestellt. Bis count = 7 passiert nichts Ungewöhnliches (die werden ignoriert). Ab count >= 8 treten Merkwürdigkeiten auf (abhängig von dem, was hinter dem Buffer im Speicher liegt.)

Viele Grüße,
Fancy


----------



## Spacerat (6. Jun 2012)

Okay, das hat ein Gesicht. 
Wärst du jetzt angemeldet gewesen, hätte ich mich sogar bedanken können.


----------



## TheWhiteShadow (7. Jun 2012)

Guest2 hat gesagt.:


> Du kannst das auch mit dem Beispiel oben ausprobieren. Ab count = 4 wird das Quad korrekt dargestellt. Bis count = 7 passiert nichts Ungewöhnliches (die werden ignoriert). Ab count >= 8 treten Merkwürdigkeiten auf (abhängig von dem, was hinter dem Buffer im Speicher liegt.)
> 
> Viele Grüße,
> Fancy



Ok, ich hab es bei meinem Rumexperimentieren immer nur einmal laufen gehabt. Vermutlich hatte ich da einfach Glück gehabt.
Diese nativen Buffer geben mit auch dieses retro-Gefühl wieder, als ich noch mit C angefangen hab.^^


----------

