I've just started learning gamedev (in particular android EGL based) and have ran over a code from Pro Android Games 2 that looks as follows:

/* * Copyright (C) 2007 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */

package opengl.scenes.cubes;

import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer;

import javax.microedition.khronos.opengles.GL10;

public class Cube {

public Cube(){

    int one = 0x10000;
    int vertices[] = {
            -one, -one, -one,
            one, -one, -one,
            one,  one, -one,
            -one,  one, -one,
            -one, -one,  one,
            one, -one,  one,
            one,  one,  one,
            -one,  one,  one,

    int colors[] = {
            0,    0,    0,  one,
            one,    0,    0,  one,
            one,  one,    0,  one,
            0,  one,    0,  one,
            0,    0,  one,  one,
            one,    0,  one,  one,
            one,  one,  one,  one,
            0,  one,  one,  one,

    byte indices[] = {
            0, 4, 5,    0, 5, 1,
            1, 5, 6,    1, 6, 2,
            2, 6, 7,    2, 7, 3,
            3, 7, 4,    3, 4, 0,
            4, 7, 6,    4, 6, 5,
            3, 0, 1,    3, 1, 2

    // Buffers to be passed to gl*Pointer() functions
    // must be direct, i.e., they must be placed on the
    // native heap where the garbage collector cannot vbb.asIntBuffer()
    // move them.
    // Buffers with multi-byte datatypes (e.g., short, int, float)
    // must have their byte order set to native order

    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
    mVertexBuffer = vbb.asIntBuffer();

    ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
    mColorBuffer = cbb.asIntBuffer();

    mIndexBuffer = ByteBuffer.allocateDirect(indices.length);

public void draw(GL10 gl)
    gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer);
    gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);
    gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);

private IntBuffer   mVertexBuffer;
private IntBuffer   mColorBuffer;
private ByteBuffer  mIndexBuffer;}

So it suggests to draw a cube using triangles. My question is: can I draw the same cube using GL_TPOLYGON? If so, isn't that an easier/more understandable way to do things?


2 Answers 2


It is indeed possible to draw polygons using OpenGL by passing GL_POLYGON instead of GL_TRIANGLES as the first parameter of glDrawElements(). Unfortunately, this is not supported in OpenGL ES, which is the subset of OpenGL that's available for your platform.

In addition to GL_POLYGON, the GL_QUADS and GL_QUAD_STRIP primitives are not supported either.

Fortunately, there's nothing you can do with quads that you can't do with triangles.


As mentioned in this thread: Why do game engines convert models to triangles compared to keeping it as four side polygon triangles are what we generally use.

If you want to work in quads, add some higher level code to add quads to an index buffer that then adds two triangles.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .