package com.cumt.shape;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.content.Context;
public class Cube {
private FloatBuffer vertexBuffer;
private Context context;
//float类型的字节数
private static final int BYTES_PER_FLOAT = 4;
static float vertices[] = {
//前面
0,0,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
0,0,1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,0,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
0,0,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
//后面
0,0,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,0,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
0,0,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,0,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,-1.0f,
//左面
-1.0f,0,0,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,0,0,
-1.0f,1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,0,0,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,0,0,
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,
//右面
1.0f,0,0,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,0,0,
1.0f,-1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,0,0,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,0,0,
1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
//上面
0,1.0f,0,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
0,1.0f,0,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,1.0f,0,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
0,1.0f,0,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
//下面
0,-1.0f,0,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,-1.0f,0,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
0,-1.0f,0,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,-1.0f,0,
1.0f,-1.0f,-1.0f,
1.0f,-1.0f,1.0f
};
public Cube(Context context){
this.context = context;
vertexBuffer = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
// 把坐标们加入FloatBuffer中
vertexBuffer.put(vertices);
// 设置buffer,从第一个坐标开始读
vertexBuffer.position(0);
}
}
uniform mat4 u_Matrix;
attribute vec4 a_Position;
void main()
{
gl_Position = u_Matrix * a_Position;
}
package com.cumt.shape;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;
public class Cube {
private FloatBuffer vertexBuffer;
private Context context;
//float类型的字节数
private static final int BYTES_PER_FLOAT = 4;
//共有72个顶点坐标,每个面包含12个顶点坐标
private static final int POSITION_COMPONENT_COUNT = 12*6;
// 数组中每个顶点的坐标数
private static final int COORDS_PER_VERTEX = 3;
private static final String A_POSITION = "a_Position";
private static final String U_COLOR = "u_Color";
private static final String U_MATRIX = "u_Matrix";
private int uMatrixLocation;
private int uColorLocation;
private int aPositionLocation;
private int program;
static float vertices[] = {
//前面
0,0,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
0,0,1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,0,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
0,0,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
//后面
0,0,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,0,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
0,0,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,0,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,-1.0f,
//左面
-1.0f,0,0,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,0,0,
-1.0f,1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,0,0,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,0,0,
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,
//右面
1.0f,0,0,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,0,0,
1.0f,-1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,0,0,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,0,0,
1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
//上面
0,1.0f,0,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
0,1.0f,0,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,1.0f,0,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
0,1.0f,0,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
//下面
0,-1.0f,0,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,-1.0f,0,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
0,-1.0f,0,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,-1.0f,0,
1.0f,-1.0f,-1.0f,
1.0f,-1.0f,1.0f
};
public Cube(Context context){
this.context = context;
vertexBuffer = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
// 把坐标们加入FloatBuffer中
vertexBuffer.put(vertices);
// 设置buffer,从第一个坐标开始读
vertexBuffer.position(0);
getProgram();
uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
//---------传入顶点数据数据
GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(aPositionLocation);
}
//获取program
private void getProgram(){
//获取顶点着色器文本
String vertexShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.vertex_shader);
//获取片段着色器文本
String fragmentShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.simple_fragment_shader);
//获取program的id
program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
GLES20.glUseProgram(program);
}
}
package com.cumt.utils;
import android.opengl.Matrix;
//存储系统矩阵状态的类
public class MatrixState {
private static float[] mProjMatrix = new float[16];// 4x4矩阵 存储投影矩阵
private static float[] mVMatrix = new float[16];// 摄像机位置朝向9参数矩阵
// 设置摄像机
public static void setCamera(float cx, // 摄像机位置x
float cy, // 摄像机位置y
float cz, // 摄像机位置z
float tx, // 摄像机目标点x
float ty, // 摄像机目标点y
float tz, // 摄像机目标点z
float upx, // 摄像机UP向量X分量
float upy, // 摄像机UP向量Y分量
float upz // 摄像机UP向量Z分量
) {
Matrix.setLookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz);
}
// 设置透视投影参数
public static void setProjectFrustum(float left, // near面的left
float right, // near面的right
float bottom, // near面的bottom
float top, // near面的top
float near, // near面距离
float far // far面距离
) {
Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
}
// 获取具体物体的总变换矩阵
static float[] mMVPMatrix = new float[16];
public static float[] getFinalMatrix() {
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
return mMVPMatrix;
}
}package com.cumt.shape;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.MatrixState;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;
public class Cube {
private FloatBuffer vertexBuffer;
private Context context;
//float类型的字节数
private static final int BYTES_PER_FLOAT = 4;
//共有72个顶点坐标,每个面包含12个顶点坐标
private static final int POSITION_COMPONENT_COUNT = 12*6;
// 数组中每个顶点的坐标数
private static final int COORDS_PER_VERTEX = 3;
private static final String A_POSITION = "a_Position";
private static final String U_COLOR = "u_Color";
private static final String U_MATRIX = "u_Matrix";
private int uMatrixLocation;
private int uColorLocation;
private int aPositionLocation;
private int program;
static float vertices[] = {
//前面
0,0,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
0,0,1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,0,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
0,0,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
//后面
0,0,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,0,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
0,0,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,0,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,-1.0f,
//左面
-1.0f,0,0,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,0,0,
-1.0f,1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,0,0,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,0,0,
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,
//右面
1.0f,0,0,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,0,0,
1.0f,-1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,0,0,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,0,0,
1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
//上面
0,1.0f,0,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
0,1.0f,0,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,1.0f,0,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
0,1.0f,0,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
//下面
0,-1.0f,0,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,-1.0f,0,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
0,-1.0f,0,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,-1.0f,0,
1.0f,-1.0f,-1.0f,
1.0f,-1.0f,1.0f
};
public Cube(Context context){
this.context = context;
vertexBuffer = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
// 把坐标们加入FloatBuffer中
vertexBuffer.put(vertices);
// 设置buffer,从第一个坐标开始读
vertexBuffer.position(0);
getProgram();
uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
//---------传入顶点数据数据
GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(aPositionLocation);
}
//获取program
private void getProgram(){
//获取顶点着色器文本
String vertexShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.vertex_shader);
//获取片段着色器文本
String fragmentShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.simple_fragment_shader);
//获取program的id
program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
GLES20.glUseProgram(program);
}
public void draw(){
GLES20.glUniform4f(uColorLocation, 1.0f, 0.0f, 0.0f, 0.0f);
GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, MatrixState.getFinalMatrix(),0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT);
}
}
package com.cumt.render;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import com.cumt.utils.MatrixState;
import com.cumt.shape.Cube;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;
public class MyRender implements Renderer {
private Context context;
public MyRender(Context context){
this.context = context;
}
// Circle circle;
Cube cube;
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.w("MyRender","onSurfaceCreated");
//设置屏幕背景色RGBA
glClearColor(0.5f,0.5f,0.5f, 1.0f);
// //打开深度检测
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
// //打开背面剪裁
GLES20.glEnable(GLES20.GL_CULL_FACE);
// circle = new Circle(context);
cube = new Cube(context);
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
glViewport(0,0,width,height);
float ratio = (float) width / height;
//设置投影矩阵
// circle.projectionMatrix(width, height);
// 调用此方法计算产生透视投影矩阵
MatrixState.setProjectFrustum(-ratio,ratio, -1, 1, 20, 100);
// 调用此方法产生摄像机9参数位置矩阵
MatrixState.setCamera(-16f, 8f, 45, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
}
public void onDrawFrame(GL10 gl) {
// glClear(GL_COLOR_BUFFER_BIT);
//清除深度缓冲与颜色缓冲
glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// circle.draw();
cube.draw();
}
}
package com.cumt.openglestwo_test_one;
import com.cumt.render.MyRender;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
private GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置为全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 设置为横屏模式
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
glSurfaceView = new GLSurfaceView(this);
//OpenGL ES 2.0
glSurfaceView.setEGLContextClientVersion(2);
glSurfaceView.setRenderer(new MyRender(this));
// 设置渲染模式为主动渲染
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
setContentView(glSurfaceView);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
glSurfaceView.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
glSurfaceView.onResume();
}
}
package com.cumt.shape;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.MatrixState;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;
public class Cube {
//顶点坐标
private FloatBuffer vertexBuffer;
//颜色坐标
private FloatBuffer colorBuffer;
private Context context;
//float类型的字节数
private static final int BYTES_PER_FLOAT = 4;
//共有72个顶点坐标,每个面包含12个顶点坐标
private static final int POSITION_COMPONENT_COUNT = 12*6;
// 数组中每个顶点的坐标数
private static final int COORDS_PER_VERTEX = 3;
private static final String A_POSITION = "a_Position";
private static final String U_COLOR = "u_Color";
private static final String U_MATRIX = "u_Matrix";
private int uMatrixLocation;
private int uColorLocation;
private int aPositionLocation;
private int program;
static float vertices[] = {
//前面
0,0,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
0,0,1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,0,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
0,0,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
//后面
0,0,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,0,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
0,0,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,0,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,-1.0f,
//左面
-1.0f,0,0,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,0,0,
-1.0f,1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,0,0,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,0,0,
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,
//右面
1.0f,0,0,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,0,0,
1.0f,-1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,0,0,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,0,0,
1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
//上面
0,1.0f,0,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
0,1.0f,0,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,1.0f,0,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
0,1.0f,0,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
//下面
0,-1.0f,0,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,-1.0f,0,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
0,-1.0f,0,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,-1.0f,0,
1.0f,-1.0f,-1.0f,
1.0f,-1.0f,1.0f
};
//顶点颜色值数组,每个顶点4个色彩值RGBA
static float colors[]=new float[]{
//前面
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
//后面
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
//左面
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
//右面
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
//上面
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
//下面
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
};
public Cube(Context context){
this.context = context;
vertexBuffer = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
// 把坐标们加入FloatBuffer中
vertexBuffer.put(vertices);
// 设置buffer,从第一个坐标开始读
vertexBuffer.position(0);
//颜色buffer
colorBuffer = ByteBuffer
.allocateDirect(colors.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
colorBuffer.put(colors);
colorBuffer.position(0);
getProgram();
uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
//---------传入顶点数据数据
GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(aPositionLocation);
}
//获取program
private void getProgram(){
//获取顶点着色器文本
String vertexShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.vertex_shader);
//获取片段着色器文本
String fragmentShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.simple_fragment_shader);
//获取program的id
program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
GLES20.glUseProgram(program);
}
public void draw(){
GLES20.glUniform4f(uColorLocation, 1.0f, 0.0f, 0.0f, 0.0f);
GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, MatrixState.getFinalMatrix(),0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT);
}
}
//vertex_shader_cube.glsl
uniform mat4 u_Matrix;
attribute vec4 a_Position;
attribute vec4 a_Color; //顶点颜色
varying vec4 v_Color; //用于传递给片元着色器的变量
void main()
{
gl_Position = u_Matrix * a_Position;
v_Color = a_Color;//将接收的颜色传递给片元着色器
} //fragment_shader_cube.glsl
precision mediump float;
varying vec4 v_Color; //接收从顶点着色器过来的参数
void main()
{
gl_FragColor = v_Color;
}package com.cumt.shape;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.MatrixState;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;
public class Cube {
//顶点坐标
private FloatBuffer vertexBuffer;
//颜色坐标
private FloatBuffer colorBuffer;
private Context context;
//float类型的字节数
private static final int BYTES_PER_FLOAT = 4;
//共有72个顶点坐标,每个面包含12个顶点坐标
private static final int POSITION_COMPONENT_COUNT = 12*6;
// 数组中每个顶点的坐标数
private static final int COORDS_PER_VERTEX = 3;
// 颜色数组中每个颜色的值数
private static final int COORDS_PER_COLOR = 4;
private static final String A_POSITION = "a_Position";
private static final String A_COLOR = "a_Color";
private static final String U_MATRIX = "u_Matrix";
private int uMatrixLocation;
private int aColorLocation;
private int aPositionLocation;
private int program;
static float vertices[] = {
//前面
0,0,1.0f,
1.0f,1.0f,1.0f,
-1.0f,1.0f,1.0f,
0,0,1.0f,
-1.0f,1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,0,1.0f,
-1.0f,-1.0f,1.0f,
1.0f,-1.0f,1.0f,
0,0,1.0f,
1.0f,-1.0f,1.0f,
1.0f,1.0f,1.0f,
//后面
0,0,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,0,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
0,0,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,0,-1.0f,
-1.0f,1.0f,-1.0f,
1.0f,1.0f,-1.0f,
//左面
-1.0f,0,0,
-1.0f,1.0f,1.0f,
-1.0f,1.0f,-1.0f,
-1.0f,0,0,
-1.0f,1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,0,0,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,1.0f,
-1.0f,0,0,
-1.0f,-1.0f,1.0f,
-1.0f,1.0f,1.0f,
//右面
1.0f,0,0,
1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,
1.0f,0,0,
1.0f,-1.0f,1.0f,
1.0f,-1.0f,-1.0f,
1.0f,0,0,
1.0f,-1.0f,-1.0f,
1.0f,1.0f,-1.0f,
1.0f,0,0,
1.0f,1.0f,-1.0f,
1.0f,1.0f,1.0f,
//上面
0,1.0f,0,
1.0f,1.0f,1.0f,
1.0f,1.0f,-1.0f,
0,1.0f,0,
1.0f,1.0f,-1.0f,
-1.0f,1.0f,-1.0f,
0,1.0f,0,
-1.0f,1.0f,-1.0f,
-1.0f,1.0f,1.0f,
0,1.0f,0,
-1.0f,1.0f,1.0f,
1.0f,1.0f,1.0f,
//下面
0,-1.0f,0,
1.0f,-1.0f,1.0f,
-1.0f,-1.0f,1.0f,
0,-1.0f,0,
-1.0f,-1.0f,1.0f,
-1.0f,-1.0f,-1.0f,
0,-1.0f,0,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
0,-1.0f,0,
1.0f,-1.0f,-1.0f,
1.0f,-1.0f,1.0f
};
//顶点颜色值数组,每个顶点4个色彩值RGBA
static float colors[]=new float[]{
//前面
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
1,1,1,0,//中间为白色
1,0,0,0,
1,0,0,0,
//后面
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
1,1,1,0,//中间为白色
0,0,1,0,
0,0,1,0,
//左面
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
1,1,1,0,//中间为白色
1,0,1,0,
1,0,1,0,
//右面
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
1,1,1,0,//中间为白色
1,1,0,0,
1,1,0,0,
//上面
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
1,1,1,0,//中间为白色
0,1,0,0,
0,1,0,0,
//下面
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
1,1,1,0,//中间为白色
0,1,1,0,
0,1,1,0,
};
public Cube(Context context){
this.context = context;
vertexBuffer = ByteBuffer
.allocateDirect(vertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
// 把坐标们加入FloatBuffer中
vertexBuffer.put(vertices);
// 设置buffer,从第一个坐标开始读
vertexBuffer.position(0);
//颜色buffer
colorBuffer = ByteBuffer
.allocateDirect(colors.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
colorBuffer.put(colors);
colorBuffer.position(0);
getProgram();
aColorLocation = GLES20.glGetAttribLocation(program, A_COLOR);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
//---------传入顶点数据数据
GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(aPositionLocation);
//---------传入颜色数据
GLES20.glVertexAttribPointer(aColorLocation, COORDS_PER_COLOR,
GLES20.GL_FLOAT, false, 0, colorBuffer);
GLES20.glEnableVertexAttribArray(aColorLocation);
}
//获取program
private void getProgram(){
//获取顶点着色器文本
String vertexShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.vertex_shader_cube);
//获取片段着色器文本
String fragmentShaderSource = TextResourceReader
.readTextFileFromResource(context, R.raw.fragment_shader_cube);
//获取program的id
program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
GLES20.glUseProgram(program);
}
public void draw(){
GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, MatrixState.getFinalMatrix(),0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT);
}
}OpenglES2.0 for Android:来画个立方体吧
原文:http://blog.csdn.net/cassiepython/article/details/51589634