OpenGL ES

OpenGL(Open Graphics Library) è una libreria utilizzata per lo sviluppo di grafica 2D e 3D.
In questo esempio andremo a disegnare un triangolo con OpenGL ES 2.0 utilizzando la classe GlSurfaceView, aggiungendo un Renderer, renderer=new MyGLRenderer();
setRenderer(renderer);
Nella classe GlSurfaceView.Renderer andiamo ad implementare i metodi:
onSurfaceCreated(): chiamato durante la creazione di GlSurfaceView.
onDrawFrame(): chiamato durante ogni ridisegno di GlSurfaceView.
onSurfaceChanged(): chiamato quando cambia la dimensione di GlSurfaceView, ad esempio quando cambia l’ orientamento dello schermo.
Nella classe Triangle andiamo ad inserire le coordinate in un ByteBuffer, per definire i vertici del triangolo e gli shader per fornire i dettagli alla pipeline di rendering della grafica:
Vertex Shader: usato per l’elaborazione dei singoli vertici
Fragment Shader: indica quale dovrebbe essere il colore del frammento e li colleghiamo in un programma:

MyGLSurfaceView.java

package com.example.openGL.activities;
import android.opengl.*;
import android.content.*;


public class MyGLSurfaceView extends GLSurfaceView
{
private final MyGLRenderer renderer;

public MyGLSurfaceView(Context context){
super(context);

setEGLContextClientVersion(2);
renderer=new MyGLRenderer();
setRenderer(renderer);

}
}

MainActivity.java

package com.example.openGL.activities;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.example.openGL.R;
import android.opengl.*;

public class MainActivity extends AppCompatActivity {

private GLSurfaceView gl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

gl=new MyGLSurfaceView(this);
setContentView(gl);

    }

}

MyGLRenderer.java

package com.example.openGL.activities;
import android.opengl.*;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.*;

public class MyGLRenderer implements GLSurfaceView.Renderer
{

private Triangle triangle;

@Override
public void onSurfaceCreated(GL10 unused,EGLConfig config)
{
GLES20.glClearColor(0.0f,2.0f,1.0f,1.0f);

triangle= new Triangle();
}

@Override
public void onDrawFrame(GL10 unused)
{
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

triangle.draw();

}

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

}

Triangle.java

package com.example.openGL.activities;
import java.nio.*;
import android.opengl.*;

public class Triangle
{
private FloatBuffer triangleVb;
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;”+
“}”;


static final int COORDS_PER_VERTEX=3;
  static float triangleCoords[]=
  {0.0f,0.4f,0.0f,
  -0.6f,-0.6f,0.0f,
  0.6f,-0.6f,0.0f};
 
  float color[]={0.9f,0.4f,0.2f,1.0f};
 
  int program;
 
  static final int vertexStride=
  COORDS_PER_VERTEX*4;
  static final int vertexCount=4;
 
  public Triangle(){
ByteBuffer byteBuffer=
ByteBuffer.allocateDirect(triangleCoords.length*4);
byteBuffer.order(ByteOrder.nativeOrder());

triangleVb=byteBuffer.asFloatBuffer();
triangleVb.put(triangleCoords);
triangleVb.position(0);

int vertexShader=loadShader
(GLES20.GL_VERTEX_SHADER,vertexShaderCode);

int fragmentShader=loadShader
(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);
 
program=GLES20.glCreateProgram();
GLES20.glAttachShader(program,vertexShader);
  GLES20.glAttachShader(program,fragmentShader);
GLES20.glLinkProgram(program);
 
  }
 
  static final int loadShader(int type,
  String shaderCode){
 
int shader=GLES20.glCreateShader(type);
GLES20.glShaderSource(shader,shaderCode);
GLES20.glCompileShader(shader);
  return (shader);
  }
 
 
  public void draw(){
 
  GLES20.glUseProgram(program);
 
int mHandle=
GLES20.glGetAttribLocation(program,”vPosition”);
GLES20.glEnableVertexAttribArray(mHandle);
GLES20.glVertexAttribPointer(mHandle,
COORDS_PER_VERTEX,
GLES20.GL_FLOAT,false,vertexStride,triangleVb);

int colorHandle=
GLES20.glGetUniformLocation(program,”vColor”);
GLES20.glUniform4fv(colorHandle,1,color,0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount);
  }

}