SlideShare a Scribd company logo
Introduction to OpenGL in
         Android
Agenda
•   OpenGL ES 2.0 – Brief Introduction
•   Getting started – Setting up the View
•   Drawing basic Shapes
•   Filling the shape with colors
•   Giving Life to Objects (Animation)
•   Applying texture to the shape
OpenGL ES
• OpenGL for Embedded Systems (ES)
• High performance 2D/3D Graphics for Mobile
  Devices
• Cross Platform Library
• Widely deployed Graphics Library
OpenGL ES 2.0
• Fixed Pipeline replaced by Programmable
  pipeline
• Provides more control to the programmer
Getting Started – Setting up the View
• Basics
  – GLSurfaceView
     • setRenderer()
  – GLSurfaceView.Renderer
     • onSurfaceCreated()
     • onSurfaceChanged()
     • onDrawFrame()
GLSurfaceView
/* add the following code snippet to add the OpenGL View to the layout*/



public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   // Create a GLSurfaceView instance and set it
    // as the ContentView for this Activity
   GLSurfaceView view = new GLSurfaceView(this);
   view.setRenderer(new ES2Renderer());
   setContentView(view);
}
GLSurfaceView.Renderer
public class ES2Renderer 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(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
      GLES20.glViewport(0, 0, width, height);
    }

}
Drawing Basic Shapes
Defining Shapes
• Vertex
• Edge
• Face

• Primitives
   –   GL_POINTS
   –   GL_LINE_STRIP
   –   GL_LINE_LOOP
   –   GL_LINES
   –   GL_TRIANGLES
   –   GL_TRIANGLE_STRIP
   –   GL_TRIANGLE_FAN
Defining the Shapes (Contd)
private void initShapes(){

      float squareCoords[] = {
         // X, Y, Z
                -1.0f, -1.0f, 0.0f, // Bottom Left
                1.0f, -1.0f, 0.0f, // Bottom Right
                1.0f, 1.0f, 0.0f, // Top Right
               -1.0f, 1.0f, 0.0f, // Top Left
      };

      // initialize vertex Buffer for square
      ByteBuffer vbb = ByteBuffer.allocateDirect(
           // (# of coordinate values * 4 bytes per float)
           squareCoords.length * 4);
      vbb.order(ByteOrder.nativeOrder());// use the device hardware's native byte order
      squareVB = vbb.asFloatBuffer(); // create a floating point buffer from the ByteBuffer
      squareVB.put(squareCoords); // add the coordinates to the FloatBuffer
      squareVB.position(0);           // set the buffer to read the first coordinate

  }
Shader Programs
• Vertex Shader
• Fragment Shader
• Loading the shader objects
• Attaching the Shader objects to Shader
  program
• Linking the program to create executable
  shader program
Shader Programs (Contd)
private final String vertexShaderCode =
     "attribute vec4 vertexPosition; n" +
     "void main(){         n" +
     " gl_Position = vertexPosition; n" +
     "}               n";

  private final String fragmentShaderCode =
    "precision mediump float; n" +
    "void main(){          n" +
    " gl_FragColor = vec4 (0.5, 0.5, 0. 5, 1.0); n" +
    "}                n";
Loading the shader
private int loadShader(int type, String shaderCode){

      // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
      // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
      int shader = GLES20.glCreateShader(type);

      // add the source code to the shader and compile it
      GLES20.glShaderSource(shader, shaderCode);
      GLES20.glCompileShader(shader);

      return shader;
  }
Compiling and Linking the Shader
                     programs
private int shaderProgram;
private int attributePositionHandle;

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
shaderProgram = GLES20.glCreateProgram();       // create empty OpenGL Program
GLES20.glAttachShader(shaderProgram, vertexShader); // add the vertex shader to program
GLES20.glAttachShader(shaderProgram, fragmentShader); // add the fragment shader to program
GLES20.glLinkProgram(shaderProgram);          // creates OpenGL program executables

// get handle to the vertex shader's vertexPosition member
attributePositionHandle = GLES20.glGetAttribLocation(shaderProgram, "vertexPosition");
Drawing the Vertices
// Add program to OpenGL environment
GLES20.glUseProgram(shaderProgram);

// Prepare the square data
GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false, 12, squareVB);
GLES20.glEnableVertexAttribArray(attributePositionHandle);

// Draw the square
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
Making the square look like square on
              screen
       (Setting up the projection)
Setting up the projection
private int MVPMatrixHandle;
private float[] MVPMatrix = new float[16];
private float[] modelMatrix = new float[16];
private float[] viewMatrix = new float[16];
private float[] projectionMatrix = new float[16];
//--
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
// this projection matrix is applied to object coodinates
// in the onDrawFrame() method
Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

//--
Matrix.setLookAtM(ViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
Applying the MVP matrix
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 MVPMatrix; n" +
     "attribute vec4 vertexPosition; n" +
     "void main(){          n" +
     // the matrix must be included as a modifier of gl_Position
     " gl_Position = MVPMatrix * vertexPosition; n" +
     "} n";

//--
MVPMatrixHandle = GLES20.glGetUniformLocation(shaderProgram, "MVPMatrix");
Applying the MVP matrix (Contd)

// Add program to OpenGL environment
GLES20.glUseProgram(shaderProgram);

// Prepare the square data
GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false,
    12, squareVB);
GLES20.glEnableVertexAttribArray(attributePositionHandle);

Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0);

// Draw the square
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
Giving life to the objects
      (Animation)
// Add program to OpenGL environment
GLES20.glUseProgram(shaderProgram);

// Prepare the square data
GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false, 12, squareVB);
GLES20.glEnableVertexAttribArray(attributePositionHandle);

long time = SystemClock.uptimeMillis() % 4000L;
 float angle = 0.090f * ((int) time);
Matrix.setRotateM(modelMatrix, 0, angle, 0, 0, 1.0f);
Matrix.multiplyMM(MVPMatrix, 0, viewMatrix, 0, modelMatrix, 0);

Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0);


// Draw the square
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
Applying Textures
Loading the texture
 int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureID = textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

InputStream is = mContext.getResources() .openRawResource(R.raw.robot);
Bitmap bitmap;
try {
   bitmap = BitmapFactory.decodeStream(is);
} finally {
   try {
      is.close();
   } catch(IOException e) {
      // Ignore.
   }
}
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
Texture coordinates
• UV Coordinates
• Mapping the texture coordinates to vertices
Mapping the texture coordinates
private final String vertexShaderCode =
      "uniform mat4 MVPMatrix; n" +
     "attribute vec4 vertexPosition; n" +
"attribute vec2 attributeTextureCoordinate;n" +
     "varying vec2 varyingTextureCoordinate;n" +
     "void main(){          n" +
" gl_Position = MVPMatrix * vertexPosition; n" +
 " varyingTextureCoord inate= attributeTextureCoordinate;n" +
     "} n";

private final String fragmentShaderCode =
     "precision mediump float;n" +
     "varying vec2 varyingTextureCoordinate;n" +
     "uniform sampler2D sTexture;n" +
     "void main() {n" +
     " gl_FragColor = texture2D(sTexture, varyingTextureCoordinate);n" +
     "}n";

More Related Content

PPT
Introduction to open_gl_in_android
PDF
OpenGL L06-Performance
PDF
OpenGL L07-Skybox and Terrian
PPTX
Trident International Graphics Workshop 2014 1/5
PDF
OpenGL Starter L02
PDF
OpenGL Starter L01
PDF
Sceneform SDK на практиці - UA Mobile 2019
PDF
Implementation of c string functions
Introduction to open_gl_in_android
OpenGL L06-Performance
OpenGL L07-Skybox and Terrian
Trident International Graphics Workshop 2014 1/5
OpenGL Starter L02
OpenGL Starter L01
Sceneform SDK на практиці - UA Mobile 2019
Implementation of c string functions

What's hot (16)

PPTX
Pointer level 2
KEY
Exploring Canvas
PPTX
PPT
C questions
PPTX
CSS Transitions, Transforms, Animations
PDF
Modeling Scenarios with Sequence Diagrams
PDF
Pointer level 2
PDF
Implementing string
PDF
Портируем существующее Web-приложение в виртуальную реальность / Денис Радин ...
PDF
WebGL and three.js
PPTX
WebGL and three.js - Web 3D Graphics
PPT
CSS3 : Animation ,Transitions, Gradients
PDF
PPTX
Introduction to three.js
PPTX
PPTX
Function basics
Pointer level 2
Exploring Canvas
C questions
CSS Transitions, Transforms, Animations
Modeling Scenarios with Sequence Diagrams
Pointer level 2
Implementing string
Портируем существующее Web-приложение в виртуальную реальность / Денис Радин ...
WebGL and three.js
WebGL and three.js - Web 3D Graphics
CSS3 : Animation ,Transitions, Gradients
Introduction to three.js
Function basics
Ad

Similar to Introduction to open gl in android droidcon - slides (20)

PDF
GL Shading Language Document by OpenGL.pdf
PDF
Webgl para JavaScripters
PDF
How to Create Custom Shaders in Flutter?
PPTX
Bs webgl소모임004
KEY
openFrameworks 007 - 3D
PPTX
COLLADA & WebGL
PPTX
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
KEY
Leaving Flatland: getting started with WebGL
PDF
Unconventional webapps with gwt:elemental & html5
PDF
Useful Tools for Making Video Games - XNA (2008)
PDF
Deep dive into deeplearn.js
KEY
openFrameworks 007 - GL
PDF
Richard Salter: Using the Titanium OpenGL Module
PDF
Android Best Practices
PDF
Games 3 dl4-example
PPTX
Android RenderScript
PDF
Enhancing UI/UX using Java animations
KEY
Getting Started with WebGL
PPTX
Fact, Fiction, and FP
PDF
Swift - One step forward from Obj-C
GL Shading Language Document by OpenGL.pdf
Webgl para JavaScripters
How to Create Custom Shaders in Flutter?
Bs webgl소모임004
openFrameworks 007 - 3D
COLLADA & WebGL
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
Leaving Flatland: getting started with WebGL
Unconventional webapps with gwt:elemental & html5
Useful Tools for Making Video Games - XNA (2008)
Deep dive into deeplearn.js
openFrameworks 007 - GL
Richard Salter: Using the Titanium OpenGL Module
Android Best Practices
Games 3 dl4-example
Android RenderScript
Enhancing UI/UX using Java animations
Getting Started with WebGL
Fact, Fiction, and FP
Swift - One step forward from Obj-C
Ad

Recently uploaded (20)

PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Big Data Technologies - Introduction.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Encapsulation theory and applications.pdf
PDF
KodekX | Application Modernization Development
PPT
Teaching material agriculture food technology
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Cloud computing and distributed systems.
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Electronic commerce courselecture one. Pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Encapsulation_ Review paper, used for researhc scholars
Unlocking AI with Model Context Protocol (MCP)
Big Data Technologies - Introduction.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
“AI and Expert System Decision Support & Business Intelligence Systems”
Encapsulation theory and applications.pdf
KodekX | Application Modernization Development
Teaching material agriculture food technology
The AUB Centre for AI in Media Proposal.docx
Cloud computing and distributed systems.
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Per capita expenditure prediction using model stacking based on satellite ima...
Electronic commerce courselecture one. Pdf
Programs and apps: productivity, graphics, security and other tools

Introduction to open gl in android droidcon - slides

  • 2. Agenda • OpenGL ES 2.0 – Brief Introduction • Getting started – Setting up the View • Drawing basic Shapes • Filling the shape with colors • Giving Life to Objects (Animation) • Applying texture to the shape
  • 3. OpenGL ES • OpenGL for Embedded Systems (ES) • High performance 2D/3D Graphics for Mobile Devices • Cross Platform Library • Widely deployed Graphics Library
  • 4. OpenGL ES 2.0 • Fixed Pipeline replaced by Programmable pipeline • Provides more control to the programmer
  • 5. Getting Started – Setting up the View • Basics – GLSurfaceView • setRenderer() – GLSurfaceView.Renderer • onSurfaceCreated() • onSurfaceChanged() • onDrawFrame()
  • 6. GLSurfaceView /* add the following code snippet to add the OpenGL View to the layout*/ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity GLSurfaceView view = new GLSurfaceView(this); view.setRenderer(new ES2Renderer()); setContentView(view); }
  • 7. GLSurfaceView.Renderer public class ES2Renderer 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(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); } }
  • 9. Defining Shapes • Vertex • Edge • Face • Primitives – GL_POINTS – GL_LINE_STRIP – GL_LINE_LOOP – GL_LINES – GL_TRIANGLES – GL_TRIANGLE_STRIP – GL_TRIANGLE_FAN
  • 10. Defining the Shapes (Contd) private void initShapes(){ float squareCoords[] = { // X, Y, Z -1.0f, -1.0f, 0.0f, // Bottom Left 1.0f, -1.0f, 0.0f, // Bottom Right 1.0f, 1.0f, 0.0f, // Top Right -1.0f, 1.0f, 0.0f, // Top Left }; // initialize vertex Buffer for square ByteBuffer vbb = ByteBuffer.allocateDirect( // (# of coordinate values * 4 bytes per float) squareCoords.length * 4); vbb.order(ByteOrder.nativeOrder());// use the device hardware's native byte order squareVB = vbb.asFloatBuffer(); // create a floating point buffer from the ByteBuffer squareVB.put(squareCoords); // add the coordinates to the FloatBuffer squareVB.position(0); // set the buffer to read the first coordinate }
  • 11. Shader Programs • Vertex Shader • Fragment Shader • Loading the shader objects • Attaching the Shader objects to Shader program • Linking the program to create executable shader program
  • 12. Shader Programs (Contd) private final String vertexShaderCode = "attribute vec4 vertexPosition; n" + "void main(){ n" + " gl_Position = vertexPosition; n" + "} n"; private final String fragmentShaderCode = "precision mediump float; n" + "void main(){ n" + " gl_FragColor = vec4 (0.5, 0.5, 0. 5, 1.0); n" + "} n";
  • 13. Loading the shader private int loadShader(int type, String shaderCode){ // create a vertex shader type (GLES20.GL_VERTEX_SHADER) // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER) int shader = GLES20.glCreateShader(type); // add the source code to the shader and compile it GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; }
  • 14. Compiling and Linking the Shader programs private int shaderProgram; private int attributePositionHandle; int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); shaderProgram = GLES20.glCreateProgram(); // create empty OpenGL Program GLES20.glAttachShader(shaderProgram, vertexShader); // add the vertex shader to program GLES20.glAttachShader(shaderProgram, fragmentShader); // add the fragment shader to program GLES20.glLinkProgram(shaderProgram); // creates OpenGL program executables // get handle to the vertex shader's vertexPosition member attributePositionHandle = GLES20.glGetAttribLocation(shaderProgram, "vertexPosition");
  • 15. Drawing the Vertices // Add program to OpenGL environment GLES20.glUseProgram(shaderProgram); // Prepare the square data GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false, 12, squareVB); GLES20.glEnableVertexAttribArray(attributePositionHandle); // Draw the square GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
  • 16. Making the square look like square on screen (Setting up the projection)
  • 17. Setting up the projection private int MVPMatrixHandle; private float[] MVPMatrix = new float[16]; private float[] modelMatrix = new float[16]; private float[] viewMatrix = new float[16]; private float[] projectionMatrix = new float[16]; //-- GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; // this projection matrix is applied to object coodinates // in the onDrawFrame() method Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7); //-- Matrix.setLookAtM(ViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
  • 18. Applying the MVP matrix 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 MVPMatrix; n" + "attribute vec4 vertexPosition; n" + "void main(){ n" + // the matrix must be included as a modifier of gl_Position " gl_Position = MVPMatrix * vertexPosition; n" + "} n"; //-- MVPMatrixHandle = GLES20.glGetUniformLocation(shaderProgram, "MVPMatrix");
  • 19. Applying the MVP matrix (Contd) // Add program to OpenGL environment GLES20.glUseProgram(shaderProgram); // Prepare the square data GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false, 12, squareVB); GLES20.glEnableVertexAttribArray(attributePositionHandle); Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0); GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0); // Draw the square GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
  • 20. Giving life to the objects (Animation)
  • 21. // Add program to OpenGL environment GLES20.glUseProgram(shaderProgram); // Prepare the square data GLES20.glVertexAttribPointer(attributePositionHandle, 3, GLES20.GL_FLOAT, false, 12, squareVB); GLES20.glEnableVertexAttribArray(attributePositionHandle); long time = SystemClock.uptimeMillis() % 4000L; float angle = 0.090f * ((int) time); Matrix.setRotateM(modelMatrix, 0, angle, 0, 0, 1.0f); Matrix.multiplyMM(MVPMatrix, 0, viewMatrix, 0, modelMatrix, 0); Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, viewMatrix, 0); GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0); // Draw the square GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
  • 23. Loading the texture int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); mTextureID = textures[0]; GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); InputStream is = mContext.getResources() .openRawResource(R.raw.robot); Bitmap bitmap; try { bitmap = BitmapFactory.decodeStream(is); } finally { try { is.close(); } catch(IOException e) { // Ignore. } } GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle();
  • 24. Texture coordinates • UV Coordinates • Mapping the texture coordinates to vertices
  • 25. Mapping the texture coordinates
  • 26. private final String vertexShaderCode = "uniform mat4 MVPMatrix; n" + "attribute vec4 vertexPosition; n" + "attribute vec2 attributeTextureCoordinate;n" + "varying vec2 varyingTextureCoordinate;n" + "void main(){ n" + " gl_Position = MVPMatrix * vertexPosition; n" + " varyingTextureCoord inate= attributeTextureCoordinate;n" + "} n"; private final String fragmentShaderCode = "precision mediump float;n" + "varying vec2 varyingTextureCoordinate;n" + "uniform sampler2D sTexture;n" + "void main() {n" + " gl_FragColor = texture2D(sTexture, varyingTextureCoordinate);n" + "}n";