标签:
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