Click here to Skip to main content
15,888,733 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi;

I have this code in openGL, which works, but I would like to eliminate the glbegin and glend to meet OpenGL ES standards.
Can anyone out there help? Thanks

C++
#include "painter.hpp"
#include "GL/glut.h"

void Painter::bar(int x1, int y1, int x2, int y2)
{
    glColor3f(0, 1, 0);
    glBegin(GL_QUADS);
    glVertex2f(x1, y1);
    glVertex2f(x2, y1);
    glVertex2f(x2, y2);
    glVertex2f(x1, y2);
    glEnd();
}

void Painter::circle(int x, int y, int radius)
{
    glColor3f(1, 0, 0);
    glBegin(GL_POLYGON);
    glVertex2f(x + radius, y);
    glVertex2f(x, y + radius);
    glVertex2f(x - radius, y); 
    glVertex2f(x, y - radius);
    glEnd();
}
Posted
Updated 2-Nov-13 6:13am
v2

1 solution

In OpenGL ES 2.0, GL_QUADS and GL_POLYGON is not supported. Also fixed function pipeline is disabled in OpenGL ES 2.0. You need to create a shader program, and attach vertex shader and pixel shader with this program. Then set vertex data to the this program.

Here is a sample code in OpenGLES2.0.

Vertex shader source
C++
// Vertex shader program.
attribute vec4 Position;
attribute vec4 SourceColor;
varying vec4 DestinationColor;

void main(void)
{
    DestinationColor = SourceColor;
    gl_Position = Position;
}


Pixel shader source
C++
// Pixel shader.
varying lowp vec4 DestinationColor;

void main(void)
{
    gl_FragColor = DestinationColor;
}


Setup vertex data
C++
private final float TriangleVerticesData[]                           =
{// X, Y, Z,
-1.0f, -1.0f, 0.0f, 
-1.0f, 1.0f, 0.0f, 
1.0f, -1.0f, 0.0f, 
1.0f, 1.0f, 0.0f,};

ByteBuffer temp     = ByteBuffer.allocateDirect( TriangleVerticesData.length * 4);
temp.order( ByteOrder.nativeOrder());
mTriangleVertices   = temp.asFloatBuffer();
mTriangleVertices.put( TriangleVerticesData ).position( 0 );


Prepare shader program
C++
// Prepare program, vertex and pixel shader setup.
nShaderProgram = GLES20.glCreateProgram();

// Vertex shader
int VSshader = GLES20.glCreateShader( GLES20.GL_VERTEX_SHADER );
GLES20.glShaderSource( VSshader, VSshaderSource);
GLES20.glCompileShader( VSshader );

int compiled[] = new int[1];
            GLES20.glGetShaderiv( shader, GLES20.GL_COMPILE_STATUS, compiled, 0 );
            if ( 0 == compiled[0] ) { // compilation failed.
                GLES20.glDeleteShader( shader );
                shader = 0;
            }

// Pixel shader.
int PSshader = GLES20.glCreateShader( GLES20.GL_PIXEL_SHADER );
GLES20.glShaderSource( VSshader, PSshaderSource);
GLES20.glCompileShader( PSshader );

{
int compiled[] = new int[1];
            GLES20.glGetShaderiv( shader, GLES20.GL_COMPILE_STATUS, compiled, 0 );
            if ( 0 == compiled[0] ) { // compilation failed.
                GLES20.glDeleteShader( shader );
                shader = 0;
            }
}


Bind vertex data and draw quad to screen.

C++
GLES20.glUseProgram( nShaderProgram );
       int nParam = GLES20.glGetAttribLocation( nShaderProgram, "Position" );

       mTriangleVertices.position( 0);
       GLES20.glVertexAttribPointer( nParam, 3, GLES20.GL_FLOAT, false,
                                     4 * sizeof(, // 3 vertices for 4 vertices
                   mTriangleVertices );
       GLES20.glEnableVertexAttribArray( nParam );


           // Draw
           GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT );
           GLES20.glDrawArrays( GLES20.GL_TRIANGLE_STRIP, 0, 4 );


GL_POLYGON is also allowed in OpenGLES 2.0, therefore you have to prepare equivalent vertex buffers for the POLYGON
object.

Please refer following link for more details.

http://developer.android.com/training/graphics/opengl/draw.html
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900