public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {
}
在HelloOpenGLES10Renderer类中必须实现Renderer接口的三个抽象方法:onDrawFrame,onSurfaceChanged,onSurfaceCreated
下面我们通过一个实例来演示下:
首先我们需要创建一个GLSurfaceView:
class HelloOpenGLES10SurfaceView extends GLSurfaceView {
public HelloOpenGLES10SurfaceView(Context context){
super(context);
setRenderer(new HelloOpenGLES10Renderer());
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView view=new HelloOpenGLES10SurfaceView(this);
setContentView(view);
}
public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {
float rotateTri, rotateQuad;
private FloatBuffer triangleVB;
// 正方形的四个顶点
private FloatBuffer quateBuffer;
/**
* 将float数组转换存储在字节缓冲数组
* @param arr
* @return
*/
private void initQuate() {
float[] four = { -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f, 0.5f, };
ByteBuffer vbb = ByteBuffer.allocateDirect(
//分配缓冲空间,一个float占4个字节
four.length * 4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序, 其中ByteOrder.nativeOrder()是获取本机字节顺序
quateBuffer = vbb.asFloatBuffer();//转换为float型
quateBuffer.put(four); //添加数据
quateBuffer.position(0); //设置数组的起始位置
}
private void initShapes() {
float triangleCoords[] = {
// X, Y, Z
-0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 };
ByteBuffer vbb = ByteBuffer.allocateDirect(
triangleCoords.length * 4);
vbb.order(ByteOrder.nativeOrder());
triangleVB = vbb.asFloatBuffer();
triangleVB.put(triangleCoords);
triangleVB.position(0);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 设置背景色
gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
initShapes();
initQuate();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
//所有的绘图操作都在此方法中执行
public void onDrawFrame(GL10 gl) {
//清楚屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//切换至模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
//重置当前的模型观察矩阵
gl.glLoadIdentity();
//确定视图点
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
//创建一个旋转三角形 沿Y轴旋转
gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);
// 画一个三角形
//设置当前颜色
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//沿X轴正方形移动1个单位
gl.glTranslatef(1.0f, 0.0f, 0.0f);
// 创建一个旋转的正方形 沿X轴旋转
gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);
// 画一个正方形
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
// 改变旋转角度
rotateTri += 0.5f;
rotateQuad -= 0.5f;
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置OpenGL的场景大小
gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); //设置投影矩阵
gl.glLoadIdentity(); //设置矩阵为单位矩阵,相当于重置矩阵
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 应用投影矩阵
}
}
最后看一下运行效果吧!