android opengl es 3.0教程,android opengl es 开发教程.pdf(3)

 type: 顶点的数据类型,可以为GL_BYTE, GL_SHORT, GL_FIXED,或GL_FLOAT ,缺省为浮点类型GL_FLOAT 。 stride: 每个相邻顶点之间在数组中的间隔(字节数),缺省为0,表示顶点存储之间无间隔。 pointer: 存储顶点的数组。 应用用上可以般顶点的颜色值存放在对应顶点后面,如下图,RGB 采用4字节 表示,此时相邻顶点就不是连续存放的,stride值为4 对应顶点除了可以为其定义坐标外,还可以指定颜色,材质,法线(用于光照处 理)等。 glEnableClientState 和 glDisableClientState 可以控制的pipeline 开关可以有: GL_COLOR_ARRAY (颜色) ,GL_NORMAL_ARRAY (法线), GL_TEXTURE_COORD_ARRAY (材质), GL_VERTEX_ARRAY(顶点), GL_POINT_SIZE_ARRAY_OES 等。 对应的传入颜色,顶点,材质,法线的方法如下: glColorPointer(int size,int type,int stride,Buffer pointer) glVertexPointer(int size, int type, int stride, Buffer pointer) glTexCoordPointer(int size, int type, int stride, Buffer pointer) glNormalPointer(int type, int stride, Buffer pointer) 如果需要使用三角形来构造复杂图形,可以使用GL_TRIANGLE_STRIP 或 GL_TRIANGLE_FAN 模式,另外一种是通过定义顶点序列: 如下图定义了一个正方形: 对应的顶点和buffer定义代码:private short[] indices = { 0, 1, 2, 0, 2, 3 };1//To gain some performance we also put this ones in a byte2buffer.3// short is 2 bytes, therefore we multiply the number if verticeswith 2.4ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);5ibb.order(ByteOrder.nativeOrder());6ShortBuffer indexBuffer = ibb.asShortBuffer();7indexBuffer.put(indices);8indexBuffer.position(0); 定义三角形的顶点的顺序很重要在拼接曲面的时候,用来定义面的顶点的顺序 非常重要,因为顶点的顺序定义了面的朝向(前向或是后向),为了获取绘制的 高性能,一般情况不会绘制面的前面和后面,只绘制面的“前面”。

虽然“前面”“后 面” 的定义可以应人而易,但一般为所有的“前面”定义统一的顶点顺序(顺时针或 是逆时针方向)。 下面代码设置逆时针方法为面的“前面” :1gl.glFrontFace(GL10.GL_CCW); 打开 忽略“后面”设置:1gl.glEnable(GL10.GL_CULL_FACE); 明确指明“忽略“哪个面的代码如下:1gl.glCullFace(GL10.GL_BACK);Android OpenGL ES开发教程(9)绘制点Point上一篇介绍了OpenGL ES 能够绘制的几种基本几何图形:点,线,三角形。 将分别介绍这几种基本几何图形的例子。为方便起见,暂时在同一平面上绘制这 些几何图形,在后面介绍完OpenGL ES 的坐标系统和坐标变换后,再介绍真正 的3D 图形绘制方法。 在Android OpenGL ES开发教程(7):创建实例应用OpenGLDemos 程序框架 创建了示例应用的程序框架,并提供了一个“Hello World”示例。 为避免一些重复代码,这里定义一个所有示例代码的基类OpenGLESActivity ,其定义如下:1public class OpenGLESActivity extends Activity2implements IOpenGLDemo{3/** Called when the activity is first created. */4@Override5public void onCreate(Bundle savedInstanceState) {6super.onCreate(savedInstanceState);7this.requestWindowFeature(Window.FEATURE_NO_TITLE);8getWindow().setFlags(9WindowManager.LayoutParams.FLAG_FULLSCREEN,10WindowManager.LayoutParams.FLAG_FULLSCREEN);11mGLSurfaceView = new GLSurfaceView(this); 12mGLSurfaceView.setRenderer(new OpenGLRenderer(this)); 13setContentView(mGLSurfaceView); 14} 15public void DrawScene(GL10 gl) { 16gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 17// Clears the screen and depth buffer. 18gl.glClear(GL10.GL_COLOR_BUFFER_BIT 19| GL10.GL_DEPTH_BUFFER_BIT); 20} 21@Override 22protected void onResume() { 23// Ideally a game should implement onResume() andonPause() 24// to take appropriate action when the activity looses focus 25super.onResume(); 26mGLSurfaceView.onResume(); 27} 28@Override 29protected void onPause() { 30// Ideally a game should implement onResume() and31onPause()32// to take appropriate action when the activity looses focus33super.onPause();34mGLSurfaceView.onPause();35}36protected GLSurfaceView mGLSurfaceView;37} 在onCreate 方法中创建一个GLSurfaceView mGLSurfaceView,并将屏幕设置为全屏。

并为mGLSurfaceView 设置Render. onResume ,onPause 处理GLSurfaceView的暂停和恢复。 DrawScene 使用黑色清空屏幕。 OpenGL ES 内部存放图形数据的Buffer 有COLOR ,DEPTH (深度信息)等android opengl 教程, 在绘制图形只前一般需要清空COLOR和 DEPTH Buffer 。 本例在屏幕上使用红色绘制3 个点。创建一个DrawPoint作为 OpenGLESActivity 的子类,并定义3 个顶点的坐标:1public class DrawPoint extends OpenGLESActivity2implements IOpenGLDemo{3float[] vertexArray = new float[]{4-0.8f , -0.4f * 1.732f , 0.0f ,50.8f , -0.4f * 1.732f , 0.0f ,60.0f , 0.4f * 1.732f , 0.0f ,7};8/** Called when the activity is first created. */9@Override10public void onCreate(Bundle savedInstanceState) {11super.onCreate(savedInstanceState);12}13...14} 下面为DrawPoint的DrawScene的实现:1public void DrawScene(GL10 gl) {2super.DrawScene(gl);3ByteBuffer vbb4= ByteBuffer.allocateDirect(vertexArray.length*4);5vbb.order(ByteOrder.nativeOrder());6FloatBuffer vertex = vbb.asFloatBuffer();7vertex.put(vertexArray);8vertex.position(0); 9gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 10gl.glPointSize(8f); 11gl.glLoadIdentity(); 12gl.glTranslatef(0, 0, -4); 13gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 14gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex); 15gl.glDrawArrays(GL10.GL_POINTS, 0, 3); 16gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 17}  首先是使用FloatBuffer存放三个顶点坐标。

f004c0903d743b462951d9bbe34fc335.png

 使用glColor4f(floatred, float green, float blue, float alpha) 将当前颜色设为红色。  glPointSize(float size) 可以用来设置绘制点的大小。  使用glEnableClientState打开Pipeline的Vectex 顶点“开关”  使用glVertexPointer 通知OpenGL ES 图形库顶点坐标。  使用GL_POINTS 模式使用glDrawArrays 绘制3 个顶点。本例下载Android OpenGL ES开发教程(10)绘制线段Line Segment 创建一个DrawLine Activity ,定义四个顶点: float vertexArray[] = { 1 -0.8f, -0.4f * 1.732f, 0.0f, 2 -0.4f, 0.4f * 1.732f, 0.0f, 3 0.0f, -0.4f * 1.732f, 0.0f, 4 0.4f, 0.4f * 1.732f, 0.0f, 5 }; 6 分别以三种模式GL_LINES ,GL_LINE_STRIP ,GL_LINE_LOOP 来绘制直 线: 1 public void DrawScene(GL10 gl) { 2 super.DrawScene(gl); 3 ByteBuffer vbb 4 = 5ByteBuffer.allocateDirect(vertexArray.length*4 6); 7 vbb.order(ByteOrder.nativeOrder()); 8 FloatBuffer vertex = vbb.asFloatBuffer(); 9 vertex.put(vertexArray); 10 vertex.position(0); 11 gl.glLoadIdentity(); 12 gl.glTranslatef(0, 0, -4); 13 gl.glEnableClientState(GL10.GL_VERTEX_AR 14RAY); 15 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, 16vertex); 17 index++; 18 index%=10; 19 switch(index){ 20 case 0: 21 case 1: 22 case 2: 23 gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 24 gl.glDrawArrays(GL10.GL_LINES, 0, 4); 25 break; 26 case 3: 27 case 4: 28 case 5 : 29 gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 30 gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 314); 32 break; 33 case 6: 34 case 7: 35 case 8: 36 case 9: 37 gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 38 gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 39 break; 40 } 41 gl.glDisableClientState(GL10.GL_VERTEX_A 42RRAY); 43 } 这里index的目的是为了延迟一下显示(更好的做法是使用固定时间间隔)。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-113773-3.html

由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能,通过大量已经编译和测试过的实例,详细讲解OpenGL ES 3.0中的应用程序接口(API)和图形管线,既涵盖简单图形的渲染方法,又深入介绍逐像素照明和粒子系统等高级渲染技术,并且包含大量有效使用API和硬件的实用技巧,为手持设备的各种高性能3D应用开发提供翔实指导。 《华章 OpenGL ES 3.0编程指南(原书第2版)》共16章:第1章简单介绍OpenGL ES ,并概述OpenGL ES 3.0图形管线;第2章通过绘制一个三角形的简单OpenGL ES 3.0示例程序,讲解一些API概念,并说明如何构建和运行OpenGL ES示例程序;第3章讲述为OpenGL ES 3.0创建表面和渲染上下文的API——EGL;第4章讨论创建着色器对象、编译着色器和检查编译错误的方法;第5章讲解编写着色器所需的着色语言基本知识;第6章详细介绍几何形状输入图形管线的方法,包含对顶点属性、顶点数组和缓冲区对象的讨论;第7章讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形;第8章概述顶点着色器如何融入管线,以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量;第9章和第10章介绍片段着色器,包括多重纹理、雾化、Alpha测试和用户裁剪平面等;第11章讨论片段操作,包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动;第12章介绍使用帧缓冲区对象渲染屏幕外表面;第13章讨论同步对象和栅栏的使用方法;第14章介绍OpenGL ES 3.0高级编程,包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。;第15章提供OpenGL ES 3.0中各种可用状态查询的参考;第16章讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值