标签:
<span style="font-size:14px;">package com.cumt.shape; public class Square { //float类型的字节数 private static final int BYTES_PER_FLOAT = 4; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 2; //矩形顶点坐标 static float squareCoords[] = { -0.5f, 0.5f , // top left -0.5f, -0.5f , // bottom left 0.5f, -0.5f , // bottom right 0.5f, 0.5f }; // top right }</span>
<span style="font-size:14px;">package com.cumt.shape; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import android.content.Context; public class Square { private Context context; //float类型的字节数 private static final int BYTES_PER_FLOAT = 4; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 2; //矩形顶点坐标 static float squareCoords[] = { -0.5f, 0.5f , // top left -0.5f, -0.5f , // bottom left 0.5f, -0.5f , // bottom right 0.5f, 0.5f }; // top right private FloatBuffer vertexBuffer; public Square(Context context) { this.context = context; vertexBuffer = ByteBuffer .allocateDirect(squareCoords.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer(); // 把坐标们加入FloatBuffer中 vertexBuffer.put(squareCoords); // 设置buffer,从第一个坐标开始读 vertexBuffer.position(0); } }</span>
<span style="font-size:14px;">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 Square { private Context context; //float类型的字节数 private static final int BYTES_PER_FLOAT = 4; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 2; //矩形顶点坐标 static float squareCoords[] = { -0.5f, 0.5f , // top left -0.5f, -0.5f , // bottom left 0.5f, -0.5f , // bottom right 0.5f, 0.5f }; // top right private FloatBuffer vertexBuffer; //------------第一步 : 定义两个标签,分别于着色器代码中的变量名相同, //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名 private static final String A_POSITION = "a_Position"; private static final String U_COLOR = "u_Color"; //------------第二步: 定义两个ID,我们就是通ID来实现数据的传递的,这个与前面 //------------获得program的ID的含义类似的 private int uColorLocation; private int aPositionLocation; private int program;//保存program的id public Square(Context context) { this.context = context; vertexBuffer = ByteBuffer .allocateDirect(squareCoords.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer(); // 把坐标们加入FloatBuffer中 vertexBuffer.put(squareCoords); // 设置buffer,从第一个坐标开始读 vertexBuffer.position(0); getProgram(); //----------第三步: 获取这两个ID ,是通过前面定义的标签获得的 uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR); aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION); //---------第五步: 传入数据 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.simple_vertex_shader); //获取片段着色器文本 String fragmentShaderSource = TextResourceReader .readTextFileFromResource(context, R.raw.simple_fragment_shader); //获取program的id program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource); GLES20.glUseProgram(program); } }</span>
<span style="font-size:14px;">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 Square { private Context context; //float类型的字节数 private static final int BYTES_PER_FLOAT = 4; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 2; //矩形顶点坐标 static float squareCoords[] = { -0.5f, 0.5f , // top left -0.5f, -0.5f , // bottom left 0.5f, -0.5f , // bottom right 0.5f, 0.5f }; // top right private FloatBuffer vertexBuffer; //------------第一步 : 定义两个标签,分别于着色器代码中的变量名相同, //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名 private static final String A_POSITION = "a_Position"; private static final String U_COLOR = "u_Color"; //------------第二步: 定义两个ID,我们就是通ID来实现数据的传递的,这个与前面 //------------获得program的ID的含义类似的 private int uColorLocation; private int aPositionLocation; private int program;//保存program的id //---------第四步:定义坐标元素的个数,这里有三个顶点 private static final int POSITION_COMPONENT_COUNT = 4; public Square(Context context) { this.context = context; vertexBuffer = ByteBuffer .allocateDirect(squareCoords.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer(); // 把坐标们加入FloatBuffer中 vertexBuffer.put(squareCoords); // 设置buffer,从第一个坐标开始读 vertexBuffer.position(0); getProgram(); //----------第三步: 获取这两个ID ,是通过前面定义的标签获得的 uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR); aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION); //---------第五步: 传入数据 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.simple_vertex_shader); //获取片段着色器文本 String fragmentShaderSource = TextResourceReader .readTextFileFromResource(context, R.raw.simple_fragment_shader); //获取program的id program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource); GLES20.glUseProgram(program); } //以GL_LINE_LOOP方式绘制 public void draw(){ GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); GLES20.glDrawArrays(GLES20.GL_LINE_LOOP, 0, POSITION_COMPONENT_COUNT); } }</span>
<span style="font-size:14px;">package com.cumt.render; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import com.cumt.shape.Square; import com.cumt.shape.Triangle; import android.content.Context; 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; import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; public class MyRender implements Renderer { private Context context; public MyRender(Context context){ this.context = context; } //定义三角形对象 Triangle triangle; Square square; public void onSurfaceCreated(GL10 gl, EGLConfig config) { Log.w("MyRender","onSurfaceCreated"); // TODO Auto-generated method stub //First:设置清空屏幕用的颜色,前三个参数对应红绿蓝,最后一个对应alpha glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // triangle = new Triangle(context); square = new Square(context); } public void onSurfaceChanged(GL10 gl, int width, int height) { Log.w("MyRender","onSurfaceChanged"); // TODO Auto-generated method stub //Second:设置视口尺寸,即告诉opengl可以用来渲染的surface大小 glViewport(0,0,width,height); } public void onDrawFrame(GL10 gl) { Log.w("MyRender","onDrawFrame"); // TODO Auto-generated method stub //Third:清空屏幕,擦除屏幕上所有的颜色,并用之前glClearColor定义的颜色填充整个屏幕 glClear(GL_COLOR_BUFFER_BIT); //绘制三角形 // triangle.draw(); square.draw(); } }</span>
<span style="font-size:14px;">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 Square2 { private Context context; //float类型的字节数 private static final int BYTES_PER_FLOAT = 4; // 数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 2; /*------------------第一步: 修改顶点数据-------------------------*/ //矩形顶点坐标 static float squareCoords[] = { -0.5f, 0.5f , // top left 0.5f, 0.5f , // top right -0.5f, -0.5f , // bottom left -0.5f, -0.5f , // bottom left 0.5f, -0.5f , // bottom right 0.5f, 0.5f }; // top right private FloatBuffer vertexBuffer; //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名 private static final String A_POSITION = "a_Position"; private static final String U_COLOR = "u_Color"; //------------获得program的ID的含义类似的 private int uColorLocation; private int aPositionLocation; private int program;//保存program的id /*------------------第二步: 修改顶点个数-------------------------*/ private static final int POSITION_COMPONENT_COUNT = 6; public Square2(Context context) { this.context = context; vertexBuffer = ByteBuffer .allocateDirect(squareCoords.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer(); // 把坐标们加入FloatBuffer中 vertexBuffer.put(squareCoords); // 设置buffer,从第一个坐标开始读 vertexBuffer.position(0); getProgram(); uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR); aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION); 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.simple_vertex_shader); //获取片段着色器文本 String fragmentShaderSource = TextResourceReader .readTextFileFromResource(context, R.raw.simple_fragment_shader); //获取program的id program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource); GLES20.glUseProgram(program); } //以GL_LINE_LOOP方式绘制 public void draw(){ GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); /*------------------第三步: 修改绘制方式-------------------------*/ GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT); } }</span>
<span style="font-size:14px;">//GL_TRIANGLE_STRIP static float squareCoords[] = { -0.5f, 0.5f , // top left 0.5f, 0.5f , // top right -0.5f, -0.5f , // bottom left 0.5f, -0.5f }; // bottom right private static final int POSITION_COMPONENT_COUNT = 4; public void draw(){ GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, POSITION_COMPONENT_COUNT); }</span>
<span style="font-size:14px;"> //GL_TRIANGLE_FAN 要注意点的顺序问题 (试试将 bottom right和bottom left交换位置看看绘制的是否还是矩形) static float squareCoords[] = { -0.5f, 0.5f , // top left 0.5f, 0.5f , // top right 0.5f, -0.5f , // bottom right -0.5f, -0.5f }; // bottom left private static final int POSITION_COMPONENT_COUNT = 4; public void draw(){ GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0 , POSITION_COMPONENT_COUNT); }</span>
OpenglES2.0 for Android:来画个矩形吧
标签:
原文地址:http://blog.csdn.net/cassiepython/article/details/51553842