rendered paste body/**** file : HelloWorldRenderer.java ****/
package com.leftcode.android.HelloWorld;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;
public class HelloWorldRenderer implements Renderer {
public HelloWorldRenderer(Main main) {
createBuffers();
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glDisable(GL10.GL_DITHER); // 颜色抖动据说可能严重影响性能,禁用
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 设置清除颜色缓冲区时用的RGBA颜色值
gl.glEnable(GL10.GL_DEPTH_TEST); // 开启尝试测试
gl.glDepthFunc(GL10.GL_LEQUAL); // 尝试测试方法为小于等于
gl.glClearDepthf(1f); // 清除缓冲时要用的值
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 宽高比
float aspect = (float) width / (float) (height == 0 ? 1 : height);
// 设置视口
gl.glViewport(0, 0, width, height);
// 设置当前矩阵堆栈为投影矩阵,并将矩阵重置为单位矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// 变换当前矩阵(投影矩阵),最终投影矩阵效果相当于:
// 人眼位于坐标 5,5,5 的位置,视野中心注视着 0,0,0 点,
// 垂直视野可见角度为45度,可见范围从眼前 0.1 到 200 单位远,
// Y 坐标正向为上方
GLU.gluPerspective(gl, 45.0f, aspect, 0.1f, 200.0f);
GLU.gluLookAt(gl, 5f, 5f, 5f, 0f, 0f, 0f, 0, 1, 0);
}
public void onDrawFrame(GL10 gl) {
// 清除颜色缓冲
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 设置当前矩阵堆栈为模型堆栈,并重置堆栈,
// 即随后的矩阵操作将应用到要绘制的模型上
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, new float[] { 5, 5, 5, 1 }, 0);
// 将旋转矩阵应用到当前矩阵堆栈上,即旋转模型
gl.glRotatef(anglez, 0, 0, 1);
gl.glRotatef(angley, 0, 1, 0);
gl.glRotatef(anglex, 1, 0, 0);
anglex += 0.1; // 递增角度值以便每次以不同角度绘制
angley += 0.2;
anglez += 0.3;
// 启用顶点数组、法向量、颜色数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 设置顶点数组指针为 ByteBuffer 对象 vertices
// 第一个参数为每个顶点包含的数据长度(以第二个参数表示的数据类型为单位)
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);
// 绘制 triangles 表示的三角形
gl.glDrawElements(GL10.GL_TRIANGLES, triangles.remaining(), GL10.GL_UNSIGNED_BYTE, triangles);
// 禁用顶点、法向量、颜色数组
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
private void createBuffers() {
// 创建顶点缓冲,顶点数组使用 float 类型,每个 float 长4个字节
// 并设置字节顺序为本机顺序
// 然后通过 FloatBuffer 适配器将 float 数组写入到 ByteBuffer 中
vertices = ByteBuffer.allocateDirect(data_vertices.length * 4);
vertices.order(ByteOrder.nativeOrder());
vertices.asFloatBuffer().put(data_vertices);
vertices.position(0); // 重置Buffer的当前位置
// 创建索引缓冲,索引使用 byte 类型,所以无需设置字节顺序,也无需写入适配。
triangles = ByteBuffer.allocateDirect(data_triangles.length * 2);
triangles.put(data_triangles);
triangles.position(0);
// 创建颜色缓冲
colors = ByteBuffer.allocateDirect(data_colors.length * 4);
colors.order(ByteOrder.nativeOrder());
colors.asFloatBuffer().put(data_colors);
colors.position(0);
}
private ByteBuffer vertices;
private ByteBuffer triangles;
private ByteBuffer colors;
private float anglex = 0f;
private float angley = 0f;
private float anglez = 0f;
private float[] data_vertices = {
1, 1, 1,
1, -1, 1,
-1, -1, 1,
-1, 1, 1,
1, 1, -1,
1, -1, -1,
-1, -1, -1,
-1, 1, -1,
};
private float[] data_colors = {
1, 1, 0, 1,
1, 0, 1, 1,
0, 1, 1, 1,
1, 0, 0, 1,
0, 0, 0, 1,
0, 0, 1, 1,
0, 1, 0, 1,
1, 1, 1, 1,
};
private byte[] data_triangles = {
0, 1, 2,
0, 2, 3,
0, 3, 7,
0, 7, 4,
0, 4, 5,
0, 5, 1,
6, 5, 4,
6, 4, 7,
6, 7, 3,
6, 3, 2,
6, 2, 1,
6, 1, 5
};
}