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);
}
}