在Java Android Opengl es 2.0中,不建议使用模板化。下面是一个示例代码,展示了如何在Opengl es 2.0中实现一个简单的三角形绘制。
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class MyGLRenderer implements GLSurfaceView.Renderer {
private Triangle mTriangle;
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// 设置清屏颜色为灰色
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
// 初始化三角形对象
mTriangle = new Triangle();
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
// 设置视口大小
GLES20.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 unused) {
// 清理屏幕
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
// 绘制三角形
mTriangle.draw();
}
public static class Triangle {
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;" +
"}";
private final float[] triangleCoords = {
0.0f, 0.622008459f, 0.0f, // top
-0.5f, -0.311004243f, 0.0f, // bottom left
0.5f, -0.311004243f, 0.0f // bottom right
};
private final int mProgram;
private int mPositionHandle;
private int mColorHandle;
public Triangle() {
// 添加顶点着色器
int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
// 添加片段着色器
int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
// 创建Opengl es程序对象
mProgram = GLES20.glCreateProgram();
// 将顶点着色器和片段着色器附加到程序对象上
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, fragmentShader);
// 链接程序对象
GLES20.glLinkProgram(mProgram);
}
public void draw() {
// 使用程序对象
GLES20.glUseProgram(mProgram);
// 获取顶点位置句柄
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
// 启用顶点属性数组
GLES20.glEnableVertexAttribArray(mPositionHandle);
// 设置顶点数据
GLES20.glVertexAttribPointer(
mPositionHandle,
3,
GLES20.GL_FLOAT,
false,
12,
vertexBuffer);
// 获取片段颜色句柄
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
// 设置片段颜色
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
// 绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
// 禁用顶点属性数组
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
}
public static int loadShader(int type, String shaderCode) {
// 创建着色器对象
int shader = GLES20.glCreateShader(type);
// 添加着色器源码
GLES20.glShaderSource(shader, shaderCode);
// 编译着色器
GLES20.glCompileShader(shader);
return shader;
}
}
上述代码展示了如何绘制一个简单的三角形,使用了Opengl es 2.0的API。在这个示例中,我们