android OpenGl How to draw a rectangle

android, java, opengl-es

Solution

public void setVerticesAndDraw(Float value, GL10 gl, byte color) {
    FloatBuffer vertexbuffer;
    ByteBuffer indicesBuffer;
    ByteBuffer mColorBuffer;

    byte indices[] = {0, 1, 2, 0, 2, 3};

    float vetices[] = {
        -value, value, 0.0f,
        value, value, 0.0f,
        value, -value, 0.0f,
        -value, -value, 0.0f
    };

    byte colors[] = {
        color, color, 0, color,
        0, color, color, color,
        0, 0, 0, color,
        color, 0, color, maxColor
    };

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vetices.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    vertexbuffer = byteBuffer.asFloatBuffer();
    vertexbuffer.put(vetices);
    vertexbuffer.position(0);

    indicesBuffer = ByteBuffer.allocateDirect(indices.length);
    indicesBuffer.put(indices);
    indicesBuffer.position(0);

    mColorBuffer = ByteBuffer.allocateDirect(colors.length);
    mColorBuffer.put(colors);
    mColorBuffer.position(0);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexbuffer);
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, mColorBuffer);

    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indicesBuffer);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

And you can call this method like this:

Square square = new Square();
//square.draw(gl);

square.setVerticesAndDraw(0.8f, gl, (byte) 255);

square.setVerticesAndDraw(0.7f, gl, (byte) 150);
square.setVerticesAndDraw(0.6f, gl, (byte) 100);
square.setVerticesAndDraw(0.5f, gl, (byte) 80);
square.setVerticesAndDraw(0.4f, gl, (byte) 50);

You will see a cool image like this:

Problem

I want to draw a rectangle using OpenGL ``` package jnidemo.example.com.openglsquare; import android.content.Context; import android.opengl.GLSurfaceView; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.ShortBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MySurfaceView mySurfaceView = new MySurfaceView(this); setContentView(mySurfaceView); } class MySurfaceView extends GLSurfaceView { public MySurfaceView(Context context) { super(context); setRenderer(new MyRenderer()); } } class MyRenderer implements GLSurfaceView.Renderer { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(1.0f, 1.0f, 0.0f, 0.0f); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); float aspect = (float)width / height; gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-aspect, aspect, -1.0f, 1.0f, 1.0f, 10.0f); } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); Square square = new Square(); square.draw(gl); } } } class Square{ FloatBuffer vertexbuffer; ByteBuffer indicesBuffer; float vetices[] = { //-0.5f,0.5f,0.0f, //0.5f,0.5f,0.0f, //0.5f,-0.5f,0.0f, //-0.5f,0.5f,0.0f -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f }; byte indices[] = {0,1,2,2,1,3}; public Square(){ ByteBuffer byteBuffer=ByteBuffer.allocateDirect(vetices.length*4); byteBuffer.order(ByteOrder.nativeOrder()); vertexbuffer = byteBuffer.asFloatBuffer(); vertexbuffer.put(vetices); vertexbuffer.position(0); indicesBuffer = ByteBuffer.allocateDirect(indices.length); //indicesBuffer.order(ByteOrder.nativeOrder()); indicesBuffer.put(indices); indicesBuffer.position(0); } public void draw(GL10 gl){ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexbuffer); gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indicesBuffer); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } } ``` But nothing appears on the screen. I don't want to use any color. I just want to draw a simple square or rectangle so that I can get some idea of simple OpenGL ES drawing mechanisms. I don't know what the problem is.

Original source