OpenGL ES绘图
来源:互联网 发布:cydia微信软件源 编辑:程序博客网 时间:2024/05/16 06:16
自己学习练手。
1.在配置文件中添加如下代码
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
2.定义简单的surfaceview
class MySurfaceView extends GLSurfaceView { private final MyGLRenderer mRenderer; public MySurfaceView(Context context) { super(context); // 创建一个 OpenGL ES 2.0 上下文 setEGLContextClientVersion(2); mRenderer = new MyGLRenderer(); // 为 GLSurfaceView 设置一个渲染器 setRenderer(mRenderer); }}3.定义一个渲染器
class MyGLRenderer implements GLSurfaceView.Renderer{ private Triangle mTriangle; private Square mSquare; @Override /** *设置视图的OpenGL ES环境 */ public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { // 设置背景颜色 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 初始化三角形 mTriangle = new Triangle(); } @Override /** * 视图的几何变化就调用 */ public void onSurfaceChanged(GL10 gl10, int width, int height) { GLES20.glViewport(0, 0, width, height); Log.e("onsurfaceChanged","onsurfaceChanged"); } @Override /** * 重绘视图 */ public void onDrawFrame(GL10 gl10) { // 重绘背景颜色 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); mTriangle.draw(); } public static int loadShader(int type, String shaderCode){ //创建顶点着色器类型(GLES20.GL_VERTEX_SHADER) // 或片段着色器类型(GLES20.GL_FRAGMENT_SHADER) int shader = GLES20.glCreateShader(type); //将源代码映射到着色器并编译它 GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; }}
4.定义实现图形:三角形
public class Triangle { private final String vertexShaderCode = "attribute vec4 vPosition;" + "void main() {" + " gl_Position = vPosition;" + "}"; private final String fragmentShaderCode = "precision mediump float;" + "uniform vec4 vColor;" + "void main() {" + " gl_FragColor = vColor;" + "}"; private FloatBuffer vertexBuffer; // 这个数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 3; static float triangleCoords[] = { // 以逆时针顺序: 0.0f, 0.622008459f, 0.0f, // top -0.5f, -0.311004243f, 0.0f, // bottom left 0.5f, -0.311004243f, 0.0f // bottom right }; // 设置 颜色为红色、绿色、蓝色和alpha(不透明度)值 float color[] = {0.63671875f, 0.76953125f, 0.22265625f, 1.0f}; private final int mProgram; private int mPositionHandle; private int mColorHandle; private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX; private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex public Triangle() { // 为形状坐标初始化顶点字节缓冲区 ByteBuffer bb = ByteBuffer.allocateDirect( // (每个浮点数* 4字节) triangleCoords.length * 4); // 使用设备硬件的本地字节顺序 bb.order(ByteOrder.nativeOrder()); // 从ByteBuffer创建一个浮点缓冲区 vertexBuffer = bb.asFloatBuffer(); // 将坐标添加到FloatBuffer vertexBuffer.put(triangleCoords); //设置缓冲区以读取第一个坐标 vertexBuffer.position(0);//创建着色器 int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); // 创建空的OpenGL ES程序 mProgram = GLES20.glCreateProgram(); // 添加顶点着色器到程序 GLES20.glAttachShader(mProgram, vertexShader); //添加片段着色程序到程序 GLES20.glAttachShader(mProgram, fragmentShader); //创建OpenGL ES程序执行程序 GLES20.glLinkProgram(mProgram); } public void draw() { // 添加程序到OpenGL ES环境 GLES20.glUseProgram(mProgram); // 处理顶点着色器的vPosition成员 mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); // 为三角形顶点启用句柄 GLES20.glEnableVertexAttribArray(mPositionHandle); // 准备三角形坐标数据 GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); // 处理片段着色器的vColor成员 mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); // 为绘制三角形设置颜色 GLES20.glUniform4fv(mColorHandle, 1, color, 0); // 画一个三角形 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); // 禁用顶点数组 GLES20.glDisableVertexAttribArray(mPositionHandle); }}5.调用surfaceview
public class MainActivity extends AppCompatActivity {private SurfaceView mysSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mysSurfaceView = new MySurfaceView(this); setContentView(mysSurfaceView); }}
阅读全文
1 0
- OpenGL ES 绘图基础
- OpenGL ES绘图
- Android OpenGL ES 绘图基本概念
- Android OpenGL ES 绘图 --简单绘图
- Android OpenGL ES 2.0绘图:搭建OpenGL ES环境
- Android OpenGL ES绘图教程之一 : 构建OpenGL ES 环境
- OpenGL ES之二 – 简单绘图
- Android OpenGL ES 绘图方法参数解析
- Cocos2dx下 基本的OpenGL ES 绘图
- OpenGL ES二 – 简单绘图概述
- android3D绘图之OpenGL ES(一)
- android3D绘图之OpenGL ES(二)
- Android3D绘图之OpenGL ES(三)
- Android3D绘图之OpenGL ES(四)
- Android OpenGL ES 2.0绘图:绘制纹理
- 3D绘图之OpenGL ES
- PPAPI中使用OpenGL ES绘图
- OPENGL-ES之顶点索引绘图
- Fibre Channel光纤通道系统基础(三)
- c:forEach 遍历集合中的元素属性详解,判断是否是最后一个元素,
- java实现最大堆及堆排序
- Linux下I2C驱动client注册的方法
- win下安装composer
- OpenGL ES绘图
- SpringMVC工作原理?
- laravel-admin 使用心得
- R语言典型相关分析
- UVA 1103 象形符号
- 自定义Behavior(二)
- 数据结构-->图
- js实现复制功能
- Jtopo入门篇_技术与业务的结合