From a638474a479d04ddb164d8e2751d8379628c3e2c Mon Sep 17 00:00:00 2001 From: Joe Fernandez Date: Thu, 7 Jul 2011 15:22:09 -0700 Subject: [PATCH] Revert "docs: OpenGL Tutorials" This reverts commit 4cd8360943a167505c929a309cccd7cb56eb4138 --- docs/html/images/opengl/coordinates.png | Bin 14019 -> 0 bytes .../html/images/opengl/helloopengl-es10-1.png | Bin 24165 -> 0 bytes .../html/images/opengl/helloopengl-es10-2.png | Bin 21871 -> 0 bytes .../html/images/opengl/helloopengl-es20-1.png | Bin 20134 -> 0 bytes .../html/images/opengl/helloopengl-es20-2.png | Bin 20072 -> 0 bytes docs/html/resources/resources-data.js | 20 - .../resources/tutorials/opengl/opengl-es10.jd | 409 -------------- .../resources/tutorials/opengl/opengl-es20.jd | 514 ------------------ 8 files changed, 943 deletions(-) delete mode 100644 docs/html/images/opengl/coordinates.png delete mode 100644 docs/html/images/opengl/helloopengl-es10-1.png delete mode 100644 docs/html/images/opengl/helloopengl-es10-2.png delete mode 100644 docs/html/images/opengl/helloopengl-es20-1.png delete mode 100644 docs/html/images/opengl/helloopengl-es20-2.png delete mode 100644 docs/html/resources/tutorials/opengl/opengl-es10.jd delete mode 100644 docs/html/resources/tutorials/opengl/opengl-es20.jd diff --git a/docs/html/images/opengl/coordinates.png b/docs/html/images/opengl/coordinates.png deleted file mode 100644 index 7180cd5cecf3db079685aad9846a16881f7c2537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14019 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 Iol`;+01RQeGXMYp diff --git a/docs/html/images/opengl/helloopengl-es10-2.png b/docs/html/images/opengl/helloopengl-es10-2.png deleted file mode 100644 index c07dabbbe46d2d774713ec3dc16883344ca100be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21871 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 Ld9e~vgLnTA)5JZ< diff --git a/docs/html/images/opengl/helloopengl-es20-1.png b/docs/html/images/opengl/helloopengl-es20-1.png deleted file mode 100644 index 44abe7729cfa765446465db437666d42204959a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20134 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 XnzP38=>+@>au+1UU~daV^?d#xX-?E< diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js index f71307e651169..097d0041c73d1 100644 --- a/docs/html/resources/resources-data.js +++ b/docs/html/resources/resources-data.js @@ -761,26 +761,6 @@ var ANDROID_RESOURCES = [ en: 'A multi-part tutorial discussing intermediate-level concepts such as data access.' } }, - { - tags: ['tutorial', 'gl', 'new'], - path: 'tutorials/opengl/opengl-es10.html', - title: { - en: 'Hello OpenGL ES 1.0' - }, - description: { - en: 'The basics of implementing an application using the OpenGL ES 1.0 APIs.' - } - }, - { - tags: ['tutorial', 'gl', 'new'], - path: 'tutorials/opengl/opengl-es20.html', - title: { - en: 'Hello OpenGL ES 2.0' - }, - description: { - en: 'The basics of implementing an application using the OpenGL ES 2.0 APIs.' - } - }, { tags: ['tutorial', 'testing'], path: 'tutorials/testing/helloandroid_test.html', diff --git a/docs/html/resources/tutorials/opengl/opengl-es10.jd b/docs/html/resources/tutorials/opengl/opengl-es10.jd deleted file mode 100644 index d18a547399950..0000000000000 --- a/docs/html/resources/tutorials/opengl/opengl-es10.jd +++ /dev/null @@ -1,409 +0,0 @@ -page.title=Hello OpenGL ES 1.0 -parent.title=Tutorials -parent.link=../../browser.html?tag=tutorial -@jd:body - - - - -

This tutorial shows you how to create a simple Android application that uses OpenGL ES 1.0 and -perform some basic operations using the OpenGL ES 1.0 API, including:

- -
    -
  • Creating an application using {@link android.opengl.GLSurfaceView} and {@link -android.opengl.GLSurfaceView.Renderer}
  • -
  • Defining a graphic object and drawing it
  • -
  • Defining and applying an projection and view
  • -
  • Applying rotation to the drawn object
  • -
- -

This tutorial demonstrates use of the OpenGL ES 1.0 API. Both the OpenGL ES 1.0 and the ES 1.1 -API are supported by the Android framework since release 1.0 (API Level 1). The OpenGL ES 1.1 API -is an extention of the 1.0 API, and it's capabilities are beyond the scope of this tutorial.

- -

Beginning with Android 2.2 (API Level 8), the framework supports OpenGL ES 2.0. For more -information about compatibility for OpenGL versions and Android devices, see the 3D with OpenGL document.

- - -

Creating an OpenGL ES 1.0 Application

- -

OpenGL applications for Android have the same basic structure as other applications, however -OpenGL applications use {@link android.opengl.GLSurfaceView} where other, non-OpenGL -applications use the {@link android.view.View} or {@link android.view.SurfaceView} class.

- -

To get started using OpenGL in your Android application, you must implement both a {@link -android.opengl.GLSurfaceView} and a {@link android.opengl.GLSurfaceView.Renderer}. The {@link -android.opengl.GLSurfaceView} is the main view type for the OpenGL applications and the {@link -android.opengl.GLSurfaceView.Renderer} controls what is drawn within that view. For more -information about these classes, see the 3D -with OpenGL document.

- -

To create an application that uses OpenGL ES 1.0:

- -
    -
  1. Start a new Android project with an Activity called HelloOpenGLES10. - -

    Note: If you have not created a basic Android application yet, follow the - Hello World Tutorial instructions - to familiarize yourself with the process.

    -
  2. - -
  3. Modify the HelloOpenGLES10 class as follows: -
    -package com.example.android.apis.graphics;
    -
    -import android.app.Activity;
    -import android.content.Context;
    -import android.opengl.GLSurfaceView;
    -import android.os.Bundle;
    -
    -public class HelloOpenGLES10 extends Activity {
    -  
    -    private GLSurfaceView mGLView;    
    -  
    -    @Override
    -    public void onCreate(Bundle savedInstanceState) {
    -        super.onCreate(savedInstanceState);
    -        
    -        mGLView = new HelloOpenGLSurfaceView(this);
    -        setContentView(mGLView);
    -    }
    -    
    -    @Override
    -    protected void onPause() {
    -        super.onPause();
    -        mGLView.onPause();
    -    }
    -    
    -    @Override
    -    protected void onResume() {
    -        super.onResume();
    -        mGLView.onResume();
    -    }
    -    
    -}
    -  
    -class HelloOpenGLES10SurfaceView extends GLSurfaceView {
    -
    -    public HelloOpenGLES10SurfaceView(Context context){
    -        super(context);
    -        setRenderer(new HelloOpenGLES10Renderer());
    -    }
    -
    -}
    -
    -

    This Activity class creates a basic container for a {@link android.opengl.GLSurfaceView}.

    -
  4. - -
  5. Create the following class HelloOpenGLES10Renderer, which implements the - {@link android.opengl.GLSurfaceView.Renderer} interface: - -
    -package com.example.android.apis.graphics;
    -
    -import javax.microedition.khronos.egl.EGLConfig;
    -import javax.microedition.khronos.opengles.GL10;
    -
    -import android.opengl.GLSurfaceView;
    -
    -public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {
    -
    -    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    -        // Set the background frame color
    -        gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -    }
    -    
    -    public void onDrawFrame(GL10 gl) {
    -        // Redraw background color
    -        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    -    }
    -    
    -    public void onSurfaceChanged(GL10 gl, int width, int height) {
    -        gl.glViewport(0, 0, width, height);
    -    }
    -  
    -}
    -
    -
  6. -
- -

These classes create a simple Android application which displays a grey screen using OpenGL -ES 1.0 calls. While this application does not do anything very interesting, by creating these two -classes, you have layed the foundation needed to start drawing graphic elements with OpenGL ES -1.0.

- -

If you are familiar with the OpenGL ES APIs, these two classes should give you enough information -to start using the OpenGL ES 1.0 API and creating graphics. However, if you need a bit more help -getting started with OpenGL, head on to the next sections for a few more tips.

- -

Drawing Graphic Elements

- -

Once you have implemented a {@link android.opengl.GLSurfaceView.Renderer}, the next step is to -draw something on it. This section shows you how to define and draw a basic triangle shape with the -Android OpenGL ES 1.0 API.

- -

Note: The following instructions build on the previous section, so if you -have not been following along, go back to the previous section and catch -up.

- -

Defining a Triangle

- -

OpenGL allows you to define objects using coordinates in three-dimensional space. So, before you - can draw a triangle, you must define its coordinates. In OpenGL, the typical way to do this is to - define a vertex array for the coordinates.

- -

By default, OpenGL ES assumes a coordinate system where 0,0,0 (X,Y,Z) specifies the center of - the {@link android.opengl.GLSurfaceView} frame, 1,1,0 is the top right corner of the frame and --1,-1,0 is bottom left corner of the frame.

- -

To define a vertex array for a triangle:

- -
    -
  1. In your HelloOpenGLES10Renderer class, add new member variable to contain the -vertices of a triangle shape: -
    -    private FloatBuffer triangleVB;
    -
    -
  2. - -
  3. Create a method, initShapes() which populates this member variable: -
    -    private void initShapes(){
    -    
    -        float triangleCoords[] = {
    -            // X, Y, Z
    -            -0.5f, -0.25f, 0,
    -             0.5f, -0.25f, 0,
    -             0.0f,  0.559016994f, 0
    -        }; 
    -        
    -        // initialize vertex Buffer for triangle  
    -        ByteBuffer vbb = ByteBuffer.allocateDirect(
    -                // (# of coordinate values * 4 bytes per float)
    -                triangleCoords.length * 4); 
    -        vbb.order(ByteOrder.nativeOrder());
    -        triangleVB = vbb.asFloatBuffer();
    -        triangleVB.put(triangleCoords);
    -        triangleVB.position(0);
    -    
    -    }
    -
    -

    This method defines a two-dimensional triangle shape with three equal sides.

    -
  4. -
  5. Modify your onSurfaceCreated() method to initialize your triangle: -
    -    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    -    
    -        // Set the background frame color
    -        gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -        
    -        // initialize the triangle vertex array
    -        initShapes();
    -    }
    -
    -

    Warning: Shapes and other static objects should be initialized - once in your onSurfaceCreated() method for best performance. Avoid initializing the - new objects in onDrawFrame(), as this causes the system to re-create the objects - for every frame redraw and slows down your application. -

    -
  6. - -
- -

Draw the Triangle

- -

Now that you have defined a shape to draw, you can use the OpenGL APIs to draw the -object.

- -

To draw the triangle with OpenGL:

- -
    -
  1. Before you can draw your triangle, you must tell OpenGL that you are using vertex arrays. - Modify your onSurfaceCreated() method to enable vertex arrays. -
    -    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    -    
    -        // Set the background frame color
    -        gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -        
    -        // initialize the triangle vertex array
    -        initShapes();
    -        
    -        // Enable use of vertex arrays
    -        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    -    }
    -
    -

    At this point, you are ready to draw the triangle object in the OpenGL frame.

    -
  2. - -
  3. Modify your onDrawFrame() method to draw the triangle. -
    -    public void onDrawFrame(GL10 gl) {
    -        // Redraw background color
    -        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    -    
    -        // Draw the triangle
    -        gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
    -        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
    -        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    -    }
    -
    -

    Note: Since the triangle is stationary at this point, the system is redrawing the - object repeatedly in exactly the same place and so is not the most efficient use of the OpenGL - graphics pipeline. In a later section, we add motion to the object to - justify this use of processing power.

    -
  4. -
- -

Try running this example application on your emulator or test device and -you should see something like this:

- - - -

There are a few problems with this example. First of all, it's not going to impress your -friends. Secondly, the triangle is a bit squashed and changes shape when you change the screen -orientation of the test device. The reason the shape is skewed is due to the fact that the object is -being rendered in a frame which is not perfectly square. We fix that problem in the -next section.

- -

Using Projection and Views

- -

OpenGL Projection and Views provide a way to calculate the coordinates of graphic objects in -realistic proportions on graphics displays of any size. One of the basic problems in displaying -graphics is that Android device displays are typically not square and—by default—OpenGL -happily maps a perfectly square, uniform coordinate system onto your typically non-square -screen.

- - - -

The illustration above shows the uniform coordinate system assumed for an OpenGL frame on the - left, and how these coordinates actually map to a typical device screen in landscape orientation - on the right. To solve this problem, you can apply OpenGL projection modes and views to transform - object coordinates so your graphic objects have the correct proportions on any display.

- -

To use a projection transformation on your triangle:

-
    -
  1. Modify your onSurfaceChanged() method to enable {@link - javax.microedition.khronos.opengles.GL10#GL_PROJECTION GL10.GL_PROJECTION} mode, calculate the - screen ratio and apply the ratio as a transformation of the object coordinates. -
    -  public void onSurfaceChanged(GL10 gl, int width, int height) {
    -      gl.glViewport(0, 0, width, height);
    -      
    -      // make adjustments for screen ratio
    -      float ratio = (float) width / height;
    -      gl.glMatrixMode(GL10.GL_PROJECTION);
    -      gl.glLoadIdentity();
    -      gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);
    -  }  
    -
    -
  2. - -
  3. Next, modify your onDrawFrame() method to apply the {@link -javax.microedition.khronos.opengles.GL10#GL_MODELVIEW GL_MODELVIEW} mode and set -a view point for the display using {@link -android.opengl.GLU#gluLookAt(javax.microedition.khronos.opengles.GL10, float, float, float, float, -float, float, float, float, float) GLU#gluLookAt()}. -
    -    public void onDrawFrame(GL10 gl) {
    -        // Redraw background color
    -        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    -        
    -        // Set GL_MODELVIEW transformation mode
    -        gl.glMatrixMode(GL10.GL_MODELVIEW);
    -        gl.glLoadIdentity();
    -        
    -        // When using GL_MODELVIEW, you must set the view point
    -        GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);        
    -        
    -        // Draw the triangle
    -        ...
    -    }
    -
    -
  4. -
- -

Try running this updated application on your emulator or test device and you should see something -like this:

- - - -

Now that you have applied this transformation, the triangle has three equal sides, instead of the -squashed display in the earlier version.

- -

Adding Motion

- -

While it may be interesting exercise to create static graphic objects with OpenGL ES, chances -are you want at least some of your objects to move. In this section, we add motion to to our -triangle by rotating it.

- -

To add rotation to your triangle:

-
    -
  • Modify your onDrawFrame() method to rotate the triangle object: -
    -    public void onDrawFrame(GL10 gl) {
    -        ...    
    -        // When using GL_MODELVIEW, you must set the view point
    -        GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);        
    -    
    -        // Create a rotation for the triangle
    -        long time = SystemClock.uptimeMillis() % 4000L;
    -        float angle = 0.090f * ((int) time);
    -        gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);        
    -        
    -        // Draw the triangle
    -        ...
    -    }
    -
    -
  • -
- -

Run the application with this code and your triangle should rotate around its center.

- - - -

Additional Resources

- -

Be sure to check out the OpenGL ES code samples are available in the -API -Demos sample application and listed in Related Samples -sidebar above. -

diff --git a/docs/html/resources/tutorials/opengl/opengl-es20.jd b/docs/html/resources/tutorials/opengl/opengl-es20.jd deleted file mode 100644 index 5cdc3430fd416..0000000000000 --- a/docs/html/resources/tutorials/opengl/opengl-es20.jd +++ /dev/null @@ -1,514 +0,0 @@ -page.title=Hello OpenGL ES 1.0 -parent.title=Tutorials -parent.link=../../browser.html?tag=tutorial -@jd:body - - - - -

This tutorial shows you how to create a simple Android application that uses OpenGL ES 2.0 and -perform some basic operations using the OpenGL ES 2.0 API, including:

- -
    -
  • Creating an application using {@link android.opengl.GLSurfaceView} and {@link -android.opengl.GLSurfaceView.Renderer}
  • -
  • Defining a graphic object and drawing it
  • -
  • Defining and applying an projection and view
  • -
  • Applying rotation to the drawn object
  • -
- -

This tutorial demonstrates use of the OpenGL ES 2.0 API. Beginning with Android 2.2 (API Level -8), the framework supports OpenGL ES 2.0.

- -

Both the OpenGL ES 1.0 and the ES 1.1 API are supported by the Android framework since release -1.0 (API Level 1).For more information about compatibility for OpenGL versions and Android devices, -see the 3D with OpenGL -document.

- - -

Creating an OpenGL ES 1.0 Application

- -

OpenGL applications for Android have the same basic structure as other applications, however -OpenGL applications use {@link android.opengl.GLSurfaceView} where other, non-OpenGL -applications use the {@link android.view.View} or {@link android.view.SurfaceView} class.

- -

To get started using OpenGL in your Android application, you must implement both a {@link -android.opengl.GLSurfaceView} and a {@link android.opengl.GLSurfaceView.Renderer}. The {@link -android.opengl.GLSurfaceView} is the main view type for the OpenGL applications and the {@link -android.opengl.GLSurfaceView.Renderer} controls what is drawn within that view. For more -information about these classes, see the 3D -with OpenGL document.

- -

To create an application that uses OpenGL ES 2.0:

- -
    -
  1. Start a new Android project with an Activity called HelloOpenGLES20. - -

    Note: If you have not created a basic Android application yet, follow the - Hello World Tutorial instructions - to familiarize yourself with the process.

    -
  2. - -
  3. Modify the HelloOpenGLES20 class as follows: -
    -package com.example.android.apis.graphics;
    -
    -import android.app.Activity;
    -import android.content.Context;
    -import android.opengl.GLSurfaceView;
    -import android.os.Bundle;
    -
    -public class HelloOpenGLES20 extends Activity {
    -  
    -    private GLSurfaceView mGLView;    
    -  
    -    @Override
    -    public void onCreate(Bundle savedInstanceState) {
    -        super.onCreate(savedInstanceState);
    -        
    -        mGLView = new HelloOpenGLES20SurfaceView(this);
    -        setContentView(mGLView);
    -    }
    -    
    -    @Override
    -    protected void onPause() {
    -        super.onPause();
    -        mGLView.onPause();
    -    }
    -    
    -    @Override
    -    protected void onResume() {
    -        super.onResume();
    -        mGLView.onResume();
    -    }
    -}
    -  
    -class HelloOpenGLES20SurfaceView extends GLSurfaceView {
    -
    -    public HelloOpenGLES20SurfaceView(Context context){
    -        super(context);
    -        
    -        // Create an OpenGL ES 2.0 context.
    -        setEGLContextClientVersion(2);
    -
    -        setRenderer(new HelloOpenGLES20Renderer());
    -    }
    -}
    -
    -

    This Activity class creates a basic container for a {@link android.opengl.GLSurfaceView}.

    -
  4. - -
  5. Create the following class HelloOpenGLES20Renderer, which implements the - {@link android.opengl.GLSurfaceView.Renderer} interface: - -
    -package com.example.android.apis.graphics;
    -
    -import javax.microedition.khronos.egl.EGLConfig;
    -import javax.microedition.khronos.opengles.GL10;
    -
    -import android.opengl.GLES20;
    -import android.opengl.GLSurfaceView;
    -
    -public class HelloOpenGLES20Renderer implements GLSurfaceView.Renderer {
    -  
    -    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    -    
    -        // Set the background frame color
    -        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -    }
    -    
    -    public void onDrawFrame(GL10 unused) {
    -    
    -        // Redraw background color
    -        GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    -    }
    -    
    -    public void onSurfaceChanged(GL10 unused, int width, int height) {
    -        GLES20.glViewport(0, 0, width, height);
    -    }
    -  
    -}
    -
    -
  6. -
- -

These classes create a simple Android application which displays a grey screen using OpenGL -ES 2.0 calls. While this application does not do anything very interesting, by creating these two -classes, you have layed the foundation needed to start drawing graphic elements with OpenGL ES -2.0.

- -

If your application only supports OpenGL ES 2.0, then you should declare that your application - requires OpenGL ES 2.0 by adding the following settings to your AndroidManifest.xml file as -shown below.

- -
-...
-    </application>
-    
-    <!-- Tell the system that you need ES 2.0. -->
-    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
-
-</manifest>
-
- -

Adding this declaration hides your application from devices that do not support OpenGL ES 2.0 -in the Android Market.

- -

If you are familiar with the OpenGL ES APIs, these preceding classes and the AndroidManifest.xml -declaration should give you enough information to start using the OpenGL ES API and creating -graphics. However, if you need a bit more help getting started with OpenGL, head on to the next -sections for a few more tips.

- - -

Drawing Graphic Elements

- -

Once you have implemented a {@link android.opengl.GLSurfaceView.Renderer}, the next step is to -draw something on it. This section shows you how to define and draw a basic triangle shape with the -OpenGL ES 2.0 API.

- -

Note: The following instructions build on the previous section, so if you -have not been following along, go back to the previous section and catch -up.

- -

Defining a Triangle

- -

OpenGL allows you to define objects using coordinates in three-dimensional space. So, before you - can draw a triangle, you must define its coordinates. In OpenGL, the typical way to do this is to - define a vertex array for the coordinates.

- -

By default, OpenGL ES assumes a coordinate system where 0,0,0 (X,Y,Z) specifies the center of - the {@link android.opengl.GLSurfaceView} frame, 1,1,0 is the top right corner of the frame and --1,-1,0 is bottom left corner of the frame.

- -

To define a vertex array for a triangle:

- -
    -
  1. In your HelloOpenGLES20Renderer class, add new member variable to contain the -vertices of a triangle shape: -
    -    private FloatBuffer triangleVB;
    -
    -
  2. - -
  3. Create a method, initShapes() which populates this member variable: -
    -    private void initShapes(){
    -    
    -        float triangleCoords[] = {
    -            // X, Y, Z
    -            -0.5f, -0.25f, 0,
    -             0.5f, -0.25f, 0,
    -             0.0f,  0.559016994f, 0
    -        }; 
    -        
    -        // initialize vertex Buffer for triangle  
    -        ByteBuffer vbb = ByteBuffer.allocateDirect(
    -                // (# of coordinate values * 4 bytes per float)
    -                triangleCoords.length * 4); 
    -        vbb.order(ByteOrder.nativeOrder());
    -        triangleVB = vbb.asFloatBuffer();
    -        triangleVB.put(triangleCoords);
    -        triangleVB.position(0);
    -    
    -    }
    -
    -

    This method defines a two-dimensional triangle shape with three equal sides.

    -
  4. -
  5. Modify your onSurfaceCreated() method to initialize your triangle: -
    -    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    -    
    -        // Set the background frame color
    -        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -        
    -        // initialize the triangle vertex array
    -        initShapes();
    -    }
    -
    -

    Warning: Shapes and other static objects should be initialized - once in your onSurfaceCreated() method for best performance. Avoid initializing the - new objects in onDrawFrame(), as this causes the system to re-create the objects - for every frame redraw and slows down your application. -

    -
  6. - -
- -

Draw the Triangle

- -

Now that you have defined a shape to draw, you can now use the OpenGL APIs to draw the - object. In order to do this with OpenGL ES 2.0, you must define a vertex shader and a -fragment shader to describe how to draw your shape.

- -

To draw the triangle with OpenGL:

- -
    -
  1. In your HelloOpenGLES20Renderer class, define a vertex shader and a fragment -shader. -
    -    private final String vertexShaderCode = 
    -        "attribute vec4 vPosition;    \n" +
    -        "void main(){         \n" +
    -        " gl_Position = vPosition;  \n" +
    -        "}                \n";
    -    
    -    private final String fragmentShaderCode = 
    -        "precision mediump float; \n" +
    -        "void main(){       \n" +
    -        " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n" +
    -        "} \n";
    -
    -
  2. -
  3. In your HelloOpenGLES20Renderer class, create a method for loading the shaders. -
    -    private int loadShader(int type, String shaderCode){
    -    
    -        int shader = GLES20.glCreateShader(type);
    -        
    -        GLES20.glShaderSource(shader, shaderCode);
    -        GLES20.glCompileShader(shader);
    -        
    -        return shader;
    -    }
    -
    -
  4. - -
  5. Add the following members to your HelloOpenGLES20Renderer class for an OpenGL -Program. -
    -    private int mProgram;
    -    private int maPositionHandle;
    -
    -
  6. - -
  7. Modify your onSurfaceCreated() method to load the shaders and attach them to a -OpenGL Program. -
    -    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    -    
    -        // Set the background frame color
    -        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    -        
    -        // initialize the triangle vertex array
    -        initShapes();
    -        
    -        // Create shaders for shape and attach to program
    -        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
    -        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
    -        
    -        mProgram = GLES20.glCreateProgram();
    -        GLES20.glAttachShader(mProgram, vertexShader);
    -        GLES20.glAttachShader(mProgram, fragmentShader);
    -        GLES20.glLinkProgram(mProgram);
    -        
    -        maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    -    }
    -
    -

    At this point, you are ready to draw the triangle object in the OpenGL frame.

    -
  8. - -
  9. Modify your onDrawFrame() method to draw the triangle. -
    -    public void onDrawFrame(GL10 unused) {
    -        
    -        // Redraw background color
    -        GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    -    
    -        // Specify a program with shaders
    -        GLES20.glUseProgram(mProgram);
    -        
    -        // Prepare the triangle data
    -        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, triangleVB);
    -        GLES20.glEnableVertexAttribArray(maPositionHandle);
    -        
    -        // Draw the triangle
    -        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
    -    }
    -
    -

    Note: Since the triangle is stationary at this point, the system is redrawing the - object repeatedly in exactly the same place and so is not the most efficient use of the OpenGL - graphics pipeline. In a later section, we add motion to the object to - justify this use of processing power.

    -
  10. -
- -

Try running this example application on your emulator or test device and -you should see something like this:

- - - -

There are a few problems with this example. First of all, it's not going to impress your -friends. Secondly, the triangle is a bit squashed and changes shape when you change the screen -orientation of the test device. The reason the shape is skewed is due to the fact that the object is -being rendered in a frame which is not perfectly square. We fix that problem in the -next section.

- -

Using Projection and Views

- -

OpenGL Projection and Views provide a way to calculate the coordinates of graphic objects in -realistic proportions on graphics displays of any size. One of the basic problems in displaying -graphics is that Android device displays are typically not square and—by default—OpenGL -happily maps a perfectly square, uniform coordinate system onto your typically non-square -screen.

- - - -

The illustration above shows the uniform coordinate system assumed for an OpenGL frame on the - left, and how these coordinates actually map to a typical device screen in landscape orientation - on the right. To solve this problem, you can apply OpenGL projection modes and views to transform - object coordinates so your graphic objects have the correct proportions on any display.

- -

To use a projection transformation on your triangle:

-
    -
  1. Add the following members to your HelloOpenGLES20Renderer class. -
    -    private int muMVPMatrixHandle;
    -    private float[] mMVPMatrix = new float[16];
    -    private float[] mMMatrix = new float[16];
    -    private float[] mVMatrix = new float[16];
    -    private float[] mProjMatrix = new float[16];
    -
    -
  2. -
  3. Modify your vertexShaderCode string to add a variable for a model view -projection matrix. -
    -    private final String vertexShaderCode = 
    -        "uniform mat4 uMVPMatrix;   \n" +
    -        "attribute vec4 vPosition;  \n" +
    -        "void main(){               \n" +
    -        " gl_Position = uMVPMatrix * vPosition; \n" +
    -        "}  \n";
    -
    -
  4. -
  5. Modify your onSurfaceChanged() method to reference the uMVPMatrix -shader variable you added and define a view transformation matrix. -
    -    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    -        ...
    -        maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    -        
    -        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    -        Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    -    }
    -
    -
  6. -
  7. Next, modify your onSurfaceChanged() method to calculate the device screen -ration and create a projection matrix. -
    -    public void onSurfaceChanged(GL10 unused, int width, int height) {
    -        GLES20.glViewport(0, 0, width, height);
    -        
    -        float ratio = (float) width / height;
    -        Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
    -    }  
    -
    -
  8. -
  9. Finally, modify your onDrawFrame() method to apply the transformation. -
    -    public void onDrawFrame(GL10 unused) {
    -        ...
    -        // Apply a ModelView Projection transformation
    -        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
    -        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    -        
    -        // Draw the triangle
    -        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);        
    -    }
    -
    -
  10. -
- -

Try running this updated application on your emulator or test device and you should see -something like this:

- - - -

Now that you have applied this transformation, the triangle has three equal sides, instead of the -squashed display in the earlier version.

- - -

Adding Motion

- -

While it may be interesting exercise to create static graphic objects with OpenGL ES, chances -are you want at least some of your objects to move. In this section, we add motion to to our -triangle by rotating it.

- -

To add rotation to your triangle:

-
    -
  1. Add an additional tranformation matrix member to your HelloOpenGLES20Renderer -class. -
    -      private float[] mMMatrix = new float[16];
    -    
    -
  2. Modify your onDrawFrame() method to rotate the triangle object: -
    -    public void onDrawFrame(GL10 gl) {
    -        ...
    -    
    -        // Create a rotation for the triangle
    -        long time = SystemClock.uptimeMillis() % 4000L;
    -        float angle = 0.090f * ((int) time);
    -        Matrix.setRotateM(mMMatrix, 0, angle, 0, 0, 1.0f);
    -        Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
    -        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
    -        
    -        // Apply a ModelView Projection transformation
    -        //Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
    -        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    -        
    -        // Draw the triangle
    -        ...
    -    }
    -
    -
  3. -
- -

Run the application with this code and your triangle should rotate around its center.

- - - -

Additional Resources

- -

Be sure to check out the OpenGL ES code samples are available in the -API -Demos sample application and listed in Related Samples -sidebar above. -