From c25adda63603827f1799e0995edf286ac46f51f1 Mon Sep 17 00:00:00 2001 From: Luan Nguyen Date: Wed, 28 Jan 2015 09:30:28 -0800 Subject: [PATCH] docs: Fix various issues with incorrect code samples. bug: 15671968 Change-Id: I3219f9c5e492ee95257439d9f284120dadd277ac --- .../images/opengl/ogl-triangle-projected.png | Bin 11624 -> 7454 bytes .../html/images/opengl/ogl-triangle-touch.png | Bin 12839 -> 9688 bytes docs/html/images/opengl/ogl-triangle.png | Bin 11182 -> 7123 bytes docs/html/training/graphics/opengl/draw.jd | 96 +++++++++++++----- .../training/graphics/opengl/environment.jd | 26 ++--- docs/html/training/graphics/opengl/motion.jd | 7 +- .../training/graphics/opengl/projection.jd | 48 +++++++-- docs/html/training/graphics/opengl/touch.jd | 18 +++- 8 files changed, 140 insertions(+), 55 deletions(-) diff --git a/docs/html/images/opengl/ogl-triangle-projected.png b/docs/html/images/opengl/ogl-triangle-projected.png index 4b18b98adda141443525c6f232766b828a2e730c..a561bc569c7f3d8b4abd4812d4a74ef2cd6d4e15 100644 GIT binary patch literal 7454 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 literal 11624 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 diff --git a/docs/html/images/opengl/ogl-triangle-touch.png b/docs/html/images/opengl/ogl-triangle-touch.png index 8323dd9e968f5d5252f451d2416889d45f163526..67c4466cd5fc485baf65cda14fd0305039baa0c6 100644 GIT binary patch literal 9688 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 GxBdq{EpTW6 literal 12839 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 LD^|+C`}F?+u2%Ut diff --git a/docs/html/training/graphics/opengl/draw.jd b/docs/html/training/graphics/opengl/draw.jd index ba00627cf6b1c..a5880662b05d7 100644 --- a/docs/html/training/graphics/opengl/draw.jd +++ b/docs/html/training/graphics/opengl/draw.jd @@ -50,13 +50,21 @@ android.opengl.GLSurfaceView.Renderer#onSurfaceCreated onSurfaceCreated()} metho for memory and processing efficiency.

-public void onSurfaceCreated(GL10 unused, EGLConfig config) {
-    ...
+public class MyGLRenderer implements GLSurfaceView.Renderer {
 
-    // initialize a triangle
-    mTriangle = new Triangle();
-    // initialize a square
-    mSquare = new Square();
+    ...
+    private Triangle mTriangle;
+    private Square   mSquare;
+
+    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
+        ...
+
+        // initialize a triangle
+        mTriangle = new Triangle();
+        // initialize a square
+        mSquare = new Square();
+    }
+    ...
 }
 
@@ -77,21 +85,27 @@ one or more shapes.

You need at least one vertex shader to draw a shape and one fragment shader to color that shape. These shaders must be complied and then added to an OpenGL ES program, which is then used to draw -the shape. Here is an example of how to define basic shaders you can use to draw a shape:

+the shape. Here is an example of how to define basic shaders you can use to draw a shape in the +Triangle class:

-private final String vertexShaderCode =
-    "attribute vec4 vPosition;" +
-    "void main() {" +
-    "  gl_Position = vPosition;" +
-    "}";
+public class Triangle {
 
-private final String fragmentShaderCode =
-    "precision mediump float;" +
-    "uniform vec4 vColor;" +
-    "void main() {" +
-    "  gl_FragColor = vColor;" +
-    "}";
+    private final String vertexShaderCode =
+        "attribute vec4 vPosition;" +
+        "void main() {" +
+        "  gl_Position = vPosition;" +
+        "}";
+
+    private final String fragmentShaderCode =
+        "precision mediump float;" +
+        "uniform vec4 vColor;" +
+        "void main() {" +
+        "  gl_FragColor = vColor;" +
+        "}";
+
+    ...
+}
 

Shaders contain OpenGL Shading Language (GLSL) code that must be compiled prior to using it in @@ -125,13 +139,28 @@ get created once and then cached for later use.

public class Triangle() { ... - int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); - int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); + private final int mProgram; - mProgram = GLES20.glCreateProgram(); // create empty OpenGL ES Program - GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program - GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program - GLES20.glLinkProgram(mProgram); // creates OpenGL ES program executables + public Triangle() { + ... + + int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, + vertexShaderCode); + int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, + fragmentShaderCode); + + // create empty OpenGL ES Program + mProgram = GLES20.glCreateProgram(); + + // add the vertex shader to program + GLES20.glAttachShader(mProgram, vertexShader); + + // add the fragment shader to program + GLES20.glAttachShader(mProgram, fragmentShader); + + // creates OpenGL ES program executables + GLES20.glLinkProgram(mProgram); + } } @@ -145,6 +174,12 @@ color values to the shape’s vertex shader and fragment shader, and then execut function.

+private int mPositionHandle;
+private int mColorHandle;
+
+private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
+private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
+
 public void draw() {
     // Add program to OpenGL ES environment
     GLES20.glUseProgram(mProgram);
@@ -176,8 +211,17 @@ public void draw() {
 
 

Once you have all this code in place, drawing this object just requires a call to the {@code draw()} method from within your renderer’s {@link -android.opengl.GLSurfaceView.Renderer#onDrawFrame onDrawFrame()} method. When you run the -application, it should look something like this:

+android.opengl.GLSurfaceView.Renderer#onDrawFrame onDrawFrame()} method: + +
+public void onDrawFrame(GL10 unused) {
+    ...
+
+    mTriangle.draw();
+}
+
+ +

When you run the application, it should look something like this:

diff --git a/docs/html/training/graphics/opengl/environment.jd b/docs/html/training/graphics/opengl/environment.jd index 6b00c764f5e09..cf2b64ad80003 100644 --- a/docs/html/training/graphics/opengl/environment.jd +++ b/docs/html/training/graphics/opengl/environment.jd @@ -129,28 +129,22 @@ just create an inner class in the activity that uses it:

 class MyGLSurfaceView extends GLSurfaceView {
 
+    private final MyGLRenderer mRenderer;
+
     public MyGLSurfaceView(Context context){
         super(context);
 
+        // Create an OpenGL ES 2.0 context
+        setEGLContextClientVersion(2);
+
+        mRenderer = new MyGLRenderer();
+
         // Set the Renderer for drawing on the GLSurfaceView
-        setRenderer(new MyRenderer());
+        setRenderer(mRenderer);
     }
 }
 
-

When using OpenGL ES 2.0, you must add another call to your {@link android.opengl.GLSurfaceView} -constructor, specifying that you want to use the 2.0 API:

- -
-// Create an OpenGL ES 2.0 context
-setEGLContextClientVersion(2);
-
- -

Note: If you are using the OpenGL ES 2.0 API, make sure you declare -this in your application manifest. For more information, see Declare OpenGL ES -Use -in the Manifest.

-

One other optional addition to your {@link android.opengl.GLSurfaceView} implementation is to set the render mode to only draw the view when there is a change to your drawing data using the {@link android.opengl.GLSurfaceView#RENDERMODE_WHEN_DIRTY GLSurfaceView.RENDERMODE_WHEN_DIRTY} @@ -186,7 +180,7 @@ the geometry of the view changes, for example when the device's screen orientati

Here is a very basic implementation of an OpenGL ES renderer, that does nothing more than draw a -gray background in the {@link android.opengl.GLSurfaceView}:

+black background in the {@link android.opengl.GLSurfaceView}:

 public class MyGLRenderer implements GLSurfaceView.Renderer {
@@ -208,7 +202,7 @@ public class MyGLRenderer implements GLSurfaceView.Renderer {
 

That’s all there is to it! The code examples above create a simple Android application that -displays a gray screen using OpenGL. While this code does not do anything very interesting, by +displays a black screen using OpenGL. While this code does not do anything very interesting, by creating these classes, you have laid the foundation you need to start drawing graphic elements with OpenGL.

diff --git a/docs/html/training/graphics/opengl/motion.jd b/docs/html/training/graphics/opengl/motion.jd index fbcdd7fdfcc08..b026a4a31dbb0 100644 --- a/docs/html/training/graphics/opengl/motion.jd +++ b/docs/html/training/graphics/opengl/motion.jd @@ -45,16 +45,17 @@ to a shape with rotation.

Rotate a Shape

-

Rotating a drawing object with OpenGL ES 2.0 is relatively simple. You create another -transformation matrix (a rotation matrix) and then combine it with your projection and +

Rotating a drawing object with OpenGL ES 2.0 is relatively simple. In your renderer, create +another transformation matrix (a rotation matrix) and then combine it with your projection and camera view transformation matrices:

 private float[] mRotationMatrix = new float[16];
 public void onDrawFrame(GL10 gl) {
-    ...
     float[] scratch = new float[16];
 
+    ...
+
     // Create a rotation transformation for the triangle
     long time = SystemClock.uptimeMillis() % 4000L;
     float angle = 0.090f * ((int) time);
diff --git a/docs/html/training/graphics/opengl/projection.jd b/docs/html/training/graphics/opengl/projection.jd
index b09e74ce61ea4..356d5d42b792f 100644
--- a/docs/html/training/graphics/opengl/projection.jd
+++ b/docs/html/training/graphics/opengl/projection.jd
@@ -71,6 +71,11 @@ projection transformation {@link android.opengl.Matrix} using the {@link
 android.opengl.Matrix#frustumM Matrix.frustumM()} method:

+// mMVPMatrix is an abbreviation for "Model View Projection Matrix"
+private final float[] mMVPMatrix = new float[16];
+private final float[] mProjectionMatrix = new float[16];
+private final float[] mViewMatrix = new float[16];
+
 @Override
 public void onSurfaceChanged(GL10 unused, int width, int height) {
     GLES20.glViewport(0, 0, width, height);
@@ -95,10 +100,10 @@ view transformation in order for anything to show up on screen.

Define a Camera View

Complete the process of transforming your drawn objects by adding a camera view transformation as -part of the drawing process. In the following example code, the camera view transformation is -calculated using the {@link android.opengl.Matrix#setLookAtM Matrix.setLookAtM()} method and then -combined with the previously calculated projection matrix. The combined transformation matrices -are then passed to the drawn shape.

+part of the drawing process in your renderer. In the following example code, the camera view +transformation is calculated using the {@link android.opengl.Matrix#setLookAtM Matrix.setLookAtM()} +method and then combined with the previously calculated projection matrix. The combined +transformation matrices are then passed to the drawn shape.

 @Override
@@ -119,7 +124,32 @@ public void onDrawFrame(GL10 unused) {
 

Apply Projection and Camera Transformations

In order to use the combined projection and camera view transformation matrix shown in the -previews sections, modify the {@code draw()} method of your graphic objects to accept the combined +previews sections, first add a matrix variable to the vertex shader previously defined +in the Triangle class:

+ +
+public class Triangle {
+
+    private final String vertexShaderCode =
+        // This matrix member variable provides a hook to manipulate
+        // the coordinates of the objects that use this vertex shader
+        "uniform mat4 uMVPMatrix;" +
+        "attribute vec4 vPosition;" +
+        "void main() {" +
+        // the matrix must be included as a modifier of gl_Position
+        // Note that the uMVPMatrix factor *must be first* in order
+        // for the matrix multiplication product to be correct.
+        "  gl_Position = uMVPMatrix * vPosition;" +
+        "}";
+
+    // Use to access and set the view transformation
+    private int mMVPMatrixHandle;
+
+    ...
+}
+
+ +

Next, modify the {@code draw()} method of your graphic objects to accept the combined transformation matrix and apply it to the shape:

@@ -127,14 +157,16 @@ public void draw(float[] mvpMatrix) { // pass in the calculated transformation m
     ...
 
     // get handle to shape's transformation matrix
-    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
 
     // Pass the projection and view transformation to the shader
-    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
+    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
 
     // Draw the triangle
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
-    ...
+
+    // Disable vertex array
+    GLES20.glDisableVertexAttribArray(mPositionHandle);
 }
 
diff --git a/docs/html/training/graphics/opengl/touch.jd b/docs/html/training/graphics/opengl/touch.jd index 4c9f0c77be554..089ede7b63dac 100644 --- a/docs/html/training/graphics/opengl/touch.jd +++ b/docs/html/training/graphics/opengl/touch.jd @@ -50,6 +50,10 @@ android.opengl.GLSurfaceView#onTouchEvent onTouchEvent()} to listen for touch ev an angle of rotation for a shape.

+private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
+private float mPreviousX;
+private float mPreviousY;
+
 @Override
 public boolean onTouchEvent(MotionEvent e) {
     // MotionEvent reports input details from the touch screen
@@ -77,7 +81,7 @@ public boolean onTouchEvent(MotionEvent e) {
 
             mRenderer.setAngle(
                     mRenderer.getAngle() +
-                    ((dx + dy) * TOUCH_SCALE_FACTOR);  // = 180.0f / 320
+                    ((dx + dy) * TOUCH_SCALE_FACTOR));
             requestRender();
     }
 
@@ -108,12 +112,22 @@ public MyGLSurfaceView(Context context) {
 

The example code above requires that you expose the rotation angle through your renderer by adding a public member. Since the renderer code is running on a separate thread from the main user interface thread of your application, you must declare this public variable as {@code volatile}. -Here is the code to do that:

+Here is the code to declare the variable and expose the getter and setter pair:

 public class MyGLRenderer implements GLSurfaceView.Renderer {
     ...
+
     public volatile float mAngle;
+
+    public float getAngle() {
+        return mAngle;
+    }
+
+    public void setAngle(float angle) {
+        mAngle = angle;
+    }
+}