Android学习日记(yzy):opengl 绘制2d图形 基本框架
首先,要了解opengl 在android中只有三种绘制方式-点,线,和三角形。
点的描绘方式:GL_POINTS
线的描绘方式:
GL_LINES(每两个顶点作为独立的线)
GL_LINE_STRIF(从第0个顶点到最后一个顶点依次相连)
GL_LINE_LOOP(从第0个顶点到最后一个顶点依次相连,最后一个顶点连接初始顶点)
三角形的绘制方式:
GL_TRIANGLES(以 每三个顶点来 形成三角形)
GL_TRIANGLES_STRIP(n,n+1,n+2 依次连接的顶点形成的 所有三角形)
GL_TRIANGLES_FAN (以第0个顶点确定,其余两个顶点依次为n,n+1来绘制三角形 )
在绘制图像时,首先建一个类定义创建的图形形状。
第一步骤: float verticesArray 确定顶点, short indicesArray (索引)确定顺序。
第二步骤: 创建类如:Square(){}来缓冲数据;
ByteBuffer vbb = ByteBuffer.allocateDirect(verticesArray.length * 4)开辟新的累存块
vbb.order(ByteOrder.nativeOrder())
FloatBuffer vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);放入索引坐标数据
vertexBuffer.position(0);起始位置设定
第三步骤: 创建方法来构造形状
draw( GL10 gl )-->
gl.glColor4f(1.0f,0.0f,0.0f,1.0f);设置颜色
gl.glTranslatef(0.1f,0,-2.0f);创建的形状初始坐标
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);采用顶点坐标数组
gl.glVertexPointer(3//坐标数,GL10.GL_FIXED,0,vertexBuffer//顶点坐标缓冲 )指定顶点坐标数据
gl.glDrawElement(绘制方式,indicesArray.length//索引数,GL10.GL_UNSIGNED_SHORT//,索引缓冲)绘制图像
public class Square {private float vertices[] = {-0.1f, 0.1f, 0.0f, -0.1f, -0.1f, 0.0f, 0.1f, -0.1f, 0.0f, 0.1f, 0.1f, 0.0f, }; private short[] indices = {0, 1, 2, 0, 2, 3}; private FloatBuffer vertexBuffer; private ShortBuffer indexBuffer; public Square() {ByteBuffer v_byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); v_byteBuffer.order(ByteOrder.nativeOrder()); vertexBuffer = v_byteBuffer.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); ByteBuffer i_byteBuffer = ByteBuffer.allocateDirect(indices.length * 2); i_byteBuffer.order(ByteOrder.nativeOrder()); indexBuffer = i_byteBuffer.asShortBuffer(); indexBuffer.put(indices); indexBuffer.position(0); }public void draw(GL10 gl) {gl.glColor4f(0.8f,0.0f,0.0f,1.0f); // gl.glLoadIdentity(); gl.glTranslatef(0.1f,0,-2.0f); // gl.glFrontFace(GL10.GL_CCW); // gl.glEnable(GL10.GL_CULL_FACE); // gl.glCullFace(GL10.GL_BACK); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer); // gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // gl.glDisable(GL10.GL_CULL_FACE);
其次,再创建接口类(GLSurfaceView.Renderer)作为你要放入图像的画布。
重写方法:onSurefaceCreated,onDrawFrame和onSurfaceChanged
第一步骤:onSurefaceCreated(GL10 gl,EGLConfig config){
gl.glShadeModel(GL10.GL_SMOOTH);抗锯齿
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);Hind模式
gl.glClearColor(0.0f,0.8f,0.0f,0.5f);桌布颜色
gl.glClearDepthf(1.0f);深度清理缓存
}
第二步骤:onDrawFrame(GL10 gl){
将之前描绘的图形初始化
gl.glClear(GL10.GL_COLOR_BUFFER_BIT| GL10.GL_DEPTH_BUFFER_BIT);清理缓存
gl.glLoadIdentity()设置当前矩阵为单位矩阵
gl.glPushMatrix();
drawLine.draw(gl);绘制图像
gl.glPopMatrix();
}
第三步骤:onSurfaceChanged(GL10 gl,int width,int height){
gl.glViewport(0,0,width,height)设置视图
gl.glMatrixMode(GL10.GL_PROJECTION);设置为投影矩阵
gl.glLoadIdentity()设置当前矩阵为单位矩阵
GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
public class MyRenderer implements GLSurfaceView.Renderer {Drawcub drawcub; public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glShadeModel(GL10.GL_SMOOTH);//抗锯齿 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);//Hind模式 gl.glClearColor(0.0f,0.0f,0.2f,0.5f);//桌布颜色 gl.glClearDepthf(1.0f);//深度清理缓存 }public void onDrawFrame(GL10 gl){Square square = new Square(); DrawPoint drawPoint = new DrawPoint(); DrawLine drawLine = new DrawLine(); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // Replace the current matrix with the identity matrix gl.glLoadIdentity(); gl.glPushMatrix(); // square.draw(gl); drawcub.drawSelf(gl); gl.glPopMatrix(); }public void onSurfaceChanged(GL10 gl,int width,int height){gl.glViewport(0,0,width,height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f); drawcub = new Drawcub(0,0,0,3,(float)width/(float)height); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); }
最后setContentView将初始化的GLSrefaceView(),放入activity中。
public class SceneRenderer implements GLSurfaceView.Renderer {Drawcub drawcub; public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glShadeModel(GL10.GL_SMOOTH);//抗锯齿 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);//Hind模式 gl.glClearColor(0.0f,0.0f,0.2f,0.5f);//桌布颜色 gl.glClearDepthf(1.0f);//深度清理缓存 }public void onDrawFrame(GL10 gl){Square square = new Square(); DrawPoint drawPoint = new DrawPoint(); DrawLine drawLine = new DrawLine(); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // Replace the current matrix with the identity matrix gl.glLoadIdentity(); gl.glPushMatrix(); // square.draw(gl); drawcub.drawSelf(gl); gl.glPopMatrix(); }public void onSurfaceChanged(GL10 gl,int width,int height){gl.glViewport(0,0,width,height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f); drawcub = new Drawcub(0,0,0,3,(float)width/(float)height); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); }
续写,写了一个好玩的东西。
MainActivity:
public class MainActivity extends Activity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); GLSurfaceView view = new GLSurfaceView(this); view.setRenderer(new MyRenderer()); setContentView(view); } }
MyRenderer:
public class MyRenderer implements GLSurfaceView.Renderer {float positionX =0; float positionY =0; float positionZ =0; float length = 0.5f; float distance = 5; private float angle; Cube cube = new Cube(positionX,positionY,positionZ,length); SquareTest squareTest = new SquareTest(); boolean flag =true; public void onSurfaceCreated(GL10 gl, EGLConfig config){gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); gl.glShadeModel(GL10.GL_SMOOTH); //add gl.glClearDepthf(1.0f);// OpenGL docs. // Enables depth testing. gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs. // The type of depth testing to do. gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs. // Really nice perspective calculations. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs. GL10.GL_NICEST); }public void onDrawFrame(GL10 gl){gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(positionX ,positionY, positionZ-distance); gl.glPushMatrix(); gl.glRotatef(angle, 5, 5, 5); // square.onDraw(gl); cube.onDraw(gl); gl.glPopMatrix(); gl.glPushMatrix(); DynamicPicture(); }private void DynamicPicture(){angle++; if (flag == true){distance = distance+ 0.02f; if (distance>=12){flag = false; }}else if (flag ==false){distance = distance-0.02f; if(distance<=6){flag =true; }}}public void onSurfaceChanged(GL10 gl,int width, int height){gl.glViewport(0,0,width,height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); }}
Cube:
public class Cube {FloatBuffer verticesBuffer; ShortBuffer indexBuffer; int verticesCount ; int indexCount; public Cube(float positionX,float positionY,float positionZ, float length){float vertices[] = {positionX-length,positionY-length,positionZ-length, -(positionX-length),positionY-length,positionZ-length, -(positionX-length),-(positionY-length),positionZ-length, positionX-length,-(positionY-length),positionZ-length, positionX-length,positionY-length,-(positionZ-length), -(positionX-length),positionY-length,-(positionZ-length), -(positionX-length),-(positionY-length),-(positionZ-length), positionX-length,-(positionY-length),-(positionZ-length), }; short index[]={0,1,1,2,2,3,3,0, 4,5,5,6,6,7,7,4, 0,4,1,5,2,6,3,7 }; ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder()); verticesBuffer = vbb.asFloatBuffer(); verticesBuffer.put(vertices); verticesBuffer.position(0); // ByteBuffer ibb = ByteBuffer.allocateDirect(index.length*2); ibb.order(ByteOrder.nativeOrder()); indexBuffer = ibb.asShortBuffer(); indexBuffer.put(index); indexBuffer.position(0); verticesCount = vertices.length; indexCount = index.length; }public void onDraw(GL10 gl){gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); gl.glFrontFace(GL10.GL_CCW); gl.glEnable(GL10.GL_CULL_FACE); gl.glCullFace(GL10.GL_BACK); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0,verticesBuffer);//GL_FLOAT gl.glDrawElements(GL10.GL_LINES, indexCount, GL10.GL_UNSIGNED_SHORT, indexBuffer); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisable(GL10.GL_CULL_FACE); } }
Android学习日记(yzy):opengl 绘制2d图形 基本框架相关推荐
- OpenGL与3D开发-绘制2D图形
绘制2D图形 文章目录 绘制2D图形 1.OpenGL ES在Android中涉及的关键类 1.1.GLSurfaceView 1.2.GLSurfaceView.Renderer 接口 1.3. G ...
- Canvas学习:封装Canvas绘制基本图形API
Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...
- (转)一个用D3D绘制2D图形的例子
一个用D3D绘制2D图形的例子 思路如下: (1)函数Do_Init初始化D3D,D3D设备,顶点缓冲,纹理:主要调用这几个函数: Direct3DCreate9,GetAdapter ...
- 计算机图形学:实验二——OpenGL绘制基本图形
1. 实验目的 练习OpenGL基础编程,实现OpenGL的颜色混合和渐变效果. 2. 实验内容和要求 按要求完成以下两个绘图,提交纸质实验报告,同时提交实验报告和代码的电子版. I). 利用Open ...
- android学习日记 RecyclerView的简单使用
android学习日记 RecyclerView的简单使用 文章目录 android学习日记 RecyclerView的简单使用 一.如何使用RecyclerView? 二.使用步骤 1.首先在bui ...
- Android学习日记 Notification 通知
Android学习日记 Notification 通知 文章目录 Android学习日记 Notification 通知 前言 使用步骤 总结 前言 下拉状态栏显示的通知功能 使用步骤 代码如下: p ...
- Android开发笔记(一百五十三)OpenGL绘制三维图形的流程
从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...
- android绘制过程3d图形,Android开发之OpenGL绘制三维图形的流程
从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...
- 安卓学习日记——画布与绘制
先提一下Draw 9-patch 老版本的Android Studio是在SDK目录下的Tools里有个draw9patch 新版Android Studio是可以在AS里直接创建的(一开始没在目录下 ...
- 使用Two.js绘制2D图形的初学者指南
Two.js一个API,可轻松使用代码创建2D形状. 继续学习,您将学习如何从JavaScript创建形状和设置动画效果. Two.js与渲染器无关,因此您可以依靠相同的API使用Canvas,SVG ...
最新文章
- 小猿圈linux之运维工程师面试题(答案版)
- SOCKET是调用操作系统通信服务的一种机制
- gelera mysql_基于Galera的MySQL高可用集群
- 开源:推荐一个不错的离线IP地址定位库
- ios 自定义加载动画效果
- MySQL 高级- 输出参数
- 暗通道先验去雾实现过程分析
- Linux系统下区别对比(~、/home与/root)
- VS 2019 要来了,是时候了解一下 C# 8.0 新功能
- python call agilent com_PyVISA通过RS232(USB)与安捷伦34970A通信时出现超时错误
- MongoDB学习day05--MongDB开启权限验证,创建用户
- 每日一码——链表基本操作
- Codeforces Round #253 DIV1 C 馋
- c语言显示cpuid_ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
- 黑苹果开启核显加速_【黑苹果】关于双显卡正确开启核显加速
- SPSS如何验证是否符合正态分布
- php判断4的倍数,4的倍数特征(4的倍数特征规律怎样找)
- codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
- [Erlang危机](3.2)限制输入
- objective-c常见类型%z
热门文章
- 出场顺序很重要下一句_年少有为一夜刷爆朋友圈:人生的出场顺序真的很重要...
- spring mvc 配置使用定时任务
- a36.ansible 生产实战案例 -- 基于kubeadm安装kubernetes v1.23 -- 集群部署(一)
- php微信 api,PHP微信API接口类
- 一图看懂西方哲学全脉络
- UE4 坐标系坐标轴旋转轴
- python中quadratic_python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解...
- vue pc端调用摄像头进行拍照并实现裁剪上传
- PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
- python删除重复单词_Python - 过滤重复的单词