OpenGL ES教程二
【Android开发Wiki】进阶篇使用OpenGL ES(二)-定义形状

// initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(
// (number of coordinate values * 4 bytes per float)
triangleCoords.length * 4);
-0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f }; // top right
eoe 移动开发者社区
/
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
// (# of coordinate values * 4 bytes per float)
squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0);/30 Fra bibliotek1} }
OpenGL ES 定义了以下的默认坐标系统:[0,0,0] (X,Y,Z)作为 GLSurfaceView 图像的中点, [1,1,0]是图像的右上角顶点,[-1,-1,0]是左下角顶点。如果需要该坐标系统的图片,请移 步 OpenGL ES 开发指南。 请注意,图形的坐标是按逆时针方向定义的,绘制的顺序是非常 重要的,因为它定义图形的正面以及反面,正面可以被直接绘制,而反面你可能选择以 Ope nGL ES 消除面方法使其不被绘制出来。 想要获取更多关于面与消除的信息, 请查看 OpenGL ES 开发指南。 定义方形 Define a Square 在 OpenGL 中,定义三角形是非常简单的,但你是否想要来点高难度的?比如,方形?要定 义方形,有很多种方法,其中典型的方法就是把两个三角形画在一起:
OpenGL_ES基础入门

OpenGL ES基础入门本文摘自网络,本人只是进行了一下规整,只作为学习参考使用,内容覆盖面并不全,但对于新手入门来说,有一定的帮助作用。
OpenGL ES基础入门 (1)了解OpenGL ES社区 (1)初始化EGL (3)初始化GLES (4)Hello,EGL (18)加载模型 (27)材质纹理 (31)光照 (38)压缩纹理 (40)全屏抗锯齿FSAA (51)了解OpenGL ES社区学习任何一种新技术,要先对它有一个全局性的了解,这样才知道用功的方向。
而这全局性的了解中,非常重要的一块就是要了解该技术的社区情况。
OpenGL|ES的官方组织是:/该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。
(focused on the creation of open standard, royalty-free APIs to enable the authoring and accelerated playback of dynamic media on a wide variety of platforms and devices.)在Khronos的网站上,有大量开发者资源,其中最重要的部份就是规范文档和头文件(EGL, GLES 1.x, GLES 2.x),同时还列出了很多的例子和教程。
OpenGL|ES是根据手持及移动平台的特点,对OpenGL 3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的,因此保持对OpenGL官方组织的关注是非常有益的,OpenGL ARB网站在。
Khronos对两个API的关系有非常清楚的定义:目前,各路厂商对OpenGL ES的支持才刚刚起步,在很多平台上都还没有官方的OpenGL ES实现,在这种情况,利用一些开源的产品也可以开始相关的研究和开发。
其中发展得比较好的是Vicent Mobile 3D Rendering Library (1.x /projects/ogl-es/ , 2.x/projects/ogles2 ),基于OpenGL ES的3D 引擎/projects/es3d/,在OpenGL世界里广受欢迎的GLUT 也出了ES版本 (/projects/glutes/) ,不过个人感觉,有了EGL标准,开发者不必再面对glx/wgl/agl等一堆平台相关的初始化方法,glut的作用已经小多了,不过对于从OpenGL平台转过来的用户还是非常友好的。
OpenGL_ES在S60上

OpenGL 的程序员介绍如何使用 OpenGL ES 在 S60 上进行开发。
Contents 1 简介 1.1 所需文件 2 教程:如何开始 OpenGL ES 之旅 2.1 获得手机屏幕 2.2 初始化 OpenGL ES 2.3 选择一个 OpenGL ES 配置 2.4 生成 OpenGL ES context 2.5 激活 context 2.6 关闭 OpenGL ES 3 OpenGL 和 OpenGL ES 的一些区别 4 OpengL ES 贴士 5 附录:完整的类 简介 OpenGL ES 是专为内嵌和移动设备设计的一个 2D/3D 轻量图形库, 它是基于 OpenGL API 设计的。
OpenGL ES 1.0 版基于 OpenGL 1.3,而 OpenGL ES 1.1 则是基于 OpenGL 1.5 的。
现在主要由 Khronos Group 来负责管理 OpenGL ES 的开发维护。
OpenGL ES 定义了一个概念,名为 profile,它定义了基于原始 OpenGL 的一组子功能, 以及针对 OpenGL ES 的增强功能,例 如: Common Profile: 这个 profile 在移动设备如电话或 pda 中完成; Common-Lite Profile: 这个限制较多,规定了运行 3D 图形程序所需最少的功能。
这个主要针对安全性要求高的设备,它们的可靠性成了最需要考虑的东西。
OpenGL ES 同样定义了和窗口系统(定义为 EGL)的一个接口。
这个 EGL API 是所有使 用 OpenGL ES 的手机所需的,但是它的完成是硬件相关的。
所需文件 S60 第二版 FP2 之后已经有了编写 OpenGL ES 1.0 应用程序所需的文件。
OpenGL ES 1.1 则在 S60 第三版 FP1 SDK 中出现下列头文件是运行 OpenGL ES 所需的:#include <GLES/egl.h> #include <GLES/gl.h> OpenGL ES 由一个 DLL 完成,因此程序需要这个链接库:libgles_cm.lib ws32.lib 第一个文件关系到 OpenGL ES 和 EGL,Common Profile。
OpenGL ES入门

OpenGL ES入门一、前言OpenGL ES是Khronos Group创建的一系列API中的一种(官方组织是:/)。
在桌面计算机上有两套标准的3DAPI:Direct3D和OpenGL。
Direct3D实际上是运行在windows操作系统上的标准3DAPI,而OpenGL则是跨平台的,适用于Linux、多种UNIX、MAC OS X和windows。
由于OpenGL得到了广范围的认可,所以,基于嵌入式的3DAPI---OpenGL ES也就应运而生。
沃Phone使用的芯片高通7227,它能很好的提供对OpenGL ES的支持,了解OpenGL ES 的种种特性,不仅能开发出很好的适用于沃Phone的3D游戏、3D应用等。
借助于OpenGL ES的平台无关性,只要稍微修改EGL,理论上就可以将开发的3D游戏、3D应用移植到任何支持OpenGL ES的平台上去。
本篇文档就从零开始,深入简出,跟大家介绍一下OpenGL ES的原理和开发。
OpenGL ES简介什么是OpenGL ESOpenGL ES是一套适用于手持嵌入式设备的3DAPI。
比如手机、PDA、汽车、航空等等上面都可以使用到OpenGL ES。
OpenGL ES是免授权费的、跨平台的、功能完善的2D和3D 图形应用程序接口API,它是桌面OpenGL的子集,是从OpenGL裁剪定制而来的。
由于手持设备的相关局限性,OpenGL ES相对于OpenGL不可避免的进行了相关的精简。
去除了OpenGL中比如glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POL YGONS)等复杂图元等许多非绝对必要的特性。
但是OpenGL方面的很多知识,OpenGL ES都是可以借鉴的。
OpenGL ES其实是一个状态机(State machine),它保存一种状态直至其改变。
每个状态都有本身默认的缺省值,可以通过相关的查询和设置函数进行相关的查询和设置。
OpenGLES2.0入门详解

OpenGLES2.0⼊门详解引⾃:/wangyuchun_799/article/details/77369281.决定你要⽀持的OpenGL ES的版本。
⽬前,OpenGL ES包含1.1和2.0两个版本,iPhone 3G+和iPad开始⽀持OpenGL ES2.0。
⽽且这两个版本之间的差异⾮常⼤,不仅仅在编程思想上,API之间的差距也很⼤。
因此,如果你想使⽤OpenGL ES开发3D程序或游戏,那么⾸先就要决定使⽤哪个版本,还是说两个版本都⽀持。
OpenGL ES定义了代表不同版本的宏:enum{kEAGLRenderingAPIOpenGLES1 = 1, //1.1版kEAGLRenderingAPIOpenGLES2 = 2 //2.0版}typedef NSUInteger EAGLRenderingAPI;以iPhone代码为例,你可以通过以下⽅式判断⽤户设备所⽀持的OpenGL ES版本,如果⽀持2.0,就使⽤2.0进⾏渲染;如果仅⽀持1.1,则使⽤1.1版进⾏渲染:EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2; //默认优先使⽤2.0版m_context = [[EAGLContext alloc] initWithAPI:api]; //使⽤2.0版初始化EAGLContextif (!m_context ) { //使⽤2.0版初始化EAGLContext失败api = kEAGLRenderingAPIOpenGLES1; //将API设为1.1版m_context = [[EAGLContext alloc] initWithAPI:api];//使⽤1.1版初始化EAGLContext}if (!m_context || ![EAGLContext setCurrentContext:m_context]) { //1.1版初始化失败,则释放内存[self release];return nil;}if (api == kEAGLRenderingAPIOpenGLES1) {//使⽤1.1版开始渲染}else {//使⽤2.0版开始渲染}2.你想让你的OpenGL ES程序跨⼿机平台运⾏么?Android、iPhone、windows phone⼿机系统是当前最主流的⼿机系统,如何才能让我们编写出来的程序可以跨平台运⾏呢?好消息是,这三个平台都⽀持OpenGL ES,⽽且都⽀持C++语⾔。
android OpenGL ES 笔记 2-FrameBuffer

FrameBuffer对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。
下面是创建FrameBuffer的方法:1:创建framebuffer对象。
2:创建一个或多个对象 (renderbuffers or textures),对他们进行存储分配,将它们付着到framebuffer的付着点上去。
3:测试framebuffer的完整性。
下面是Sample Code生成一个OfferScreenFramebuffer对象1:生成并绑定framebuffer2:生成colorRenderbuffer,分配内存,付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
4,检查framebuffer的完整性,在需要在frame属性被编辑后调用:用framebuffer进行纹理渲染:1:创建一个framebuffer对象。
2:创建目的纹理,并将其付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
(同上)4:检查framebuffer的完整性。
(同上)渲染Core Animation Layer:在iOS里面都是由Core Animation Layer来作显示效果的,但是OpenGL ES没有直接使用CAEAGL Layer而是定义一个UIView的子类,UIView可以被CAEAGLLayer支持。
下面是生成OpenGL ES的View步骤:1:生成一个UIView的子类用来做OpenGL ES的View;2:重写(override)layerClass方法,使得你的View使用CAEAGLLayer作为它的底层。
layerCla ss返回一个CAEAGLLayer。
3:在View 的初始化过程中,读取view的layer属性,代码如下:myEAGLLayer = (CAEAGLLayer*)yer;4:设置layer的属性。
opengles 顶点理解 -回复

opengles 顶点理解-回复OpenGL ES (Open Graphics Library for Embedded Systems) 是针对嵌入式系统的图形库,主要用于在移动设备和嵌入式平台上进行图形渲染和加速。
在OpenGL ES中,顶点是一种重要的图形元素,通过定义和操作顶点,可以创建出各种形状和效果。
本文将详细介绍OpenGL ES顶点的概念、属性和使用方法。
一、顶点概念在计算机图形学中,顶点是由一组属性(如位置、颜色、纹理坐标等)描述的几何图形的端点。
在OpenGL ES中,每个顶点通常都有一个位置属性,用于指定顶点在三维空间中的坐标。
除了位置属性外,顶点还可以具有其他属性,如颜色属性、纹理坐标属性等。
二、顶点属性顶点属性是指描述顶点特征的数据,它由多个分量组成。
在OpenGL ES 中,常见的顶点属性包括位置属性、颜色属性、法线属性、纹理坐标属性等。
这些属性可以分别存储在单独的顶点缓冲区对象(Vertex Buffer Object,VBO)中,或者打包在一个通用的顶点缓冲区对象中。
1. 位置属性位置属性是描述顶点在三维空间中位置的属性,它通常由三个浮点数分量(x、y、z)组成。
位置属性可以用来确定几何图形的形状和位置,并以此进行坐标变换、投影等操作。
在OpenGL ES中,位置属性通常被指定为顶点着色器的输入。
2. 颜色属性颜色属性是描述顶点颜色的属性,它通常由三个或四个浮点数分量(r、g、b、a)组成。
颜色属性可以用来指定顶点的着色方式,例如实现光照效果、渐变效果等。
在OpenGL ES中,颜色属性通常被指定为顶点着色器的输入。
3. 法线属性法线属性是描述三角形面的法线(即垂直于面的向量)的属性,它通常由三个浮点数分量(x、y、z)组成。
法线属性可以用来计算光照效果、阴影效果等。
在OpenGL ES中,法线属性通常被指定为顶点着色器的输入。
4. 纹理坐标属性纹理坐标属性是描述顶点在纹理图像中位置的属性,它通常由两个浮点数分量(s、t)组成。
AndroidOpenGL教程-第二课【转】

AndroidOpenGL教程-第⼆课【转】第⼆课你的第⼀个多边形:在第⼀个教程的基础上,我们添加了⼀个三⾓形和⼀个四边形。
也许你认为这很简单,但你已经迈出了⼀⼤步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形。
读完了这⼀课,你会学到如何在空间放置模型,并且会知道深度缓存的概念。
其他类不变,只更改OpenGLRenderer类。
⾸先,我们画⼀个三⾓形,主要是在OnDrawFrame⾥⾯画,使⽤的函数是gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);或者gl.glDrawElements(GL10.GL_TRIANGLES, 3, GL10.GL_FLOAT, mIndexBuffer);我们先使⽤drawArray,drawElement⾥⾯要多⽤⼀个indexBuffer。
第⼀步,定义个arrayprivate float[] mTriangleArray = {0f, 1f, 0f, // 是上顶点-1f, -1f, 0f, // 左下顶点1f, -1f, 0f // 右下顶点};这⾥实际上是定义了三⾓形的三个顶点,三个数分别是x,y,z的坐标,和数学⾥直⾓坐标系相同0f, 1f, 0f 是上顶点-1f, -1f, 0f 是左下顶点1f, -1f, 0f 是右下顶点定义个FloatBuffer,这是android画三⾓形必须的结构private FloatBuffer mTriangleBuffer;来⼀个函数转换array到Buffer我们直接上⼀个⼯具类BufferUtil类:import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;public class BufferUtil {public static FloatBuffer mBuffer;public static FloatBuffer floatToBuffer(float[] a) {// 先初始化buffer,数组的长度*4,因为⼀个float占4个字节ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);// 数组排序⽤nativeOrdermbb.order(ByteOrder.nativeOrder());mBuffer = mbb.asFloatBuffer();mBuffer.put(a);mBuffer.position(0);return mBuffer;}}注意:这⾥有个排序的问题,是使⽤⼤端(BIG_ENDIAN)还是⽤⼩端(LITTLE_ENDIAN),在android⾥⾯,opengl画图must use native order direct buffer,否则报错为ERROR/AndroidRuntime(6897): ng.IllegalArgumentException: Must use a native order direct Buffer这个错误在android1.6以上会出现,在1.5上不会出现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenGL ES 02 –绘制图元 2 -矩形严格意义上来说,矩形并不是OpenGL ES的图元。
但是,让我们面对现实,绘制这些矩形象绘制一个三角形一样非常简单。
在本教程中,我们将把基本的三角形绘制代码转化为绘制矩形。
再一次说明,这些渲染是静止的,但是我们通过转化(即移动它们)来使它们快速移动。
当然,一旦我们完成了矩形,我们将试图完成一个立方体,我们将完成一个纹理映射的立方体。
本教程的快速小结及其他教程上个教程,我们用空白画布的XCode工程来渲染了一个实心的白色的三角形。
为了做到这点,你创建了一个顶点数组,告诉OpenGL这些数据并且使用glVertexPointer() 来格式化。
为渲染这个顶点数组定义一个状态,并且使用glDrawArrays ()来渲染它。
今天,我们要使用之前的代码,用制作三角形的方法来制作一个矩形。
要做到这点,我们仅仅需要修改一对(组)代码。
第一点是显然的,我们需要4点来组成矩形,而不是原来3点的三角形。
然后,我们要告诉OpenGL用不一样的glDrawArrays().方法来绘制一个不同的物体。
让我们开始吧。
定义矩形的顶点打开之前教程中建立的XCode工程,找到drawView函数。
注释掉triangleVertices,但是不是删除它,我们在之后转换的时候还需要用到,并且添加下列代码:const GLfloatsquareVertices[] = {-1.0, 1.0, -6.0, // Top left-1.0, -1.0, -6.0, // Bottom left1.0, -1.0, -6.0, // Bottom right1.0, 1.0, -6.0// Top right};这个定义了我们的矩形。
注意,这个矩形的顶点也是逆时针的。
然后,到下面的绘制三角形的代码处,将这些代码都注释掉,回复到开始状态。
所以注释掉三个函数调用的glVertexArray(),glEnableClientState(),和glDrawArrays(),并添加以下代码:glVertexPointer(3, GL_FLOAT, 0, squareVertices); glEnableClientState(GL_VERTEX_ARRAY);glDrawArrays(GL_TRIANGLE_FAN, 0, 4);这三项职能相同,只是功能略有不同。
glVertexPointer(3, GL_FLOAT, 0, squareVertices);这个唯一的变化就是我们告诉OpenGL使用了不同的顶点设置方案,而不是现在的三角形。
glEnableClientState()同样是告诉OpenGL从顶点数组来绘制(而不是颜色数组或者其他的什么)glDrawArrays(GL_TRIANGLE_FAN, 0, 4);这里有些改变了。
在上个教程,我们使用 GL_TRIANGLES 做用第一个参数,并且使用3在第3个参数里。
第2个参数。
之前是0,这里也还是0,因为只包含了矩形的顶点。
第一个参数是绘图模式,而且你现在看到两种可能的OpenGL绘图方式。
我想花时间来讨论现在不同的绘图模式。
它们是:GL_POINTSGL_LINESGL_LINE_LOOPGL_LINE_STRIPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN我们还没有讨论点或线,所以我只介绍最后的三个。
在我开始之前,我要提醒你,顶点数组可能包含不止一个三角形,以便当您只看到一个物体顶点数组,你要知道,不仅限于这一点。
GL_TRIANGLES - 这个参数意味着OpenGL使用三个顶点来组成图形。
所以,在开始的三个顶点,将用顶点1,顶点2,顶点3来组成一个三角形。
完成后,在用下一组的三个顶点来组成三角形,直到数组结束。
GL_TRIANGLE_STRIP - OpenGL的使用将最开始的两个顶点出发,然后遍历每个顶点,这些顶点将使用前2个顶点一起组成一个三角形。
所以squareVertices[6~8]将与squareVerticies[0~2] 和squareVerticies[3~5].生成一个三角形。
squareVertices[9~11]将与 squareVertices[3~5] 和squareVertices[6~8]生成三角形。
也就是说,0,1,2这三个点组成一个三角形,1,2,3这三个点也组成一个三角形。
注意的是,squareVerticies[0~2]表示的意思是:squareVerticies[0] x坐标squareVerticies[1] y坐标squareVerticies[2] z坐标如果我没有说清楚的话,我用下面的例子来说明。
GL_TRIANGLE_FAN - 在跳过开始的2个顶点,然后遍历每个顶点,让OpenGL将这些顶点于它们前一个,以及数组的第一个顶点一起组成一个三角形。
squareVertices[6~8]将与squareVerticies[3~5](前一个)和squareVerticies[0~2](第一个).生成一个三角形。
也就是说,同样是0,1,2,3这4个顶点。
在STRIP状态下是,0,1,2;1,2,3这2个三角形。
在FAN状态下是,2,1,0;3,2,0这2个三角形。
这次我们将使用 GL_TRIANGLE_FAN ,我们将在显示区域获得一个矩形。
点击”Build & Go”,然后你将在屏幕上看到一个白色的矩形(平面)回头看你的顶点数组。
设法想像用三角形来绘制一个矩形。
OpenGL就是这样做的。
三角形点1:squareVerticies[0~2] -矩形的左上三角形点2:squareVerticies[3~5] -矩形的左下三角形点3:squareVerticies[6~8] -矩形的右下考虑到上述3点,一个三角形的OpenGL的绘制将弥补左下角的一半面积。
试想矩形被对角线分割为左上角和右下角。
如何通知这两个三角形?OpenGL刚才只绘制了矩形的左半边。
三角形点1:squareVerticies[9~11] -矩形的右上三角形点2:squareVerticies[6~8] -矩形的右下,上个点三角形点3:squareVerticies[0~2] -矩形的左上,第一点只使用了一个新的点,OpenGL可以渲染这个三角形来完成矩形。
GL_TRIANGLE_STRIP返回代码,改变glDrawArrays() 的第一个参数由GL_TRIANGLE_FAN 为GL_TRIANGLE_STRIP:。
点击”Build & Go”然后你会获得下面的图片。
让我们来看看,为什么我们只是单单修改了下绘制模式,我们却没有获得一个矩形。
OpenGL展示我们的顶点数组如下:三角形点1:squareVerticies[0~2] -矩形的左上三角形点2:squareVerticies[3~5] -矩形的左下三角形点3:squareVerticies[6~8] -矩形的右下OpenGL使用了前3个点来渲染一个三角形。
这个左下的三角形和之前是相同的。
三角形点1:squareVerticies[9~11] -矩形的右上三角形点2:squareVerticies[6~8] -矩形的右下,上个点三角形点3:squareVerticies[3~5] -矩形的左下,上2个点这个是现在渲染三角形的3个点。
这个三角形和我们理想的三角形有90度的夹角。
如果我们提供的顶点的数组不同,我们可以实现一个正确的GL_TRIANGLE_STRIP ,我们现在还是做我们的GL_TRIANGLE_FAN 。
必须记住,你的绘制模式必须和你的顶点数组保持一致,否则,就会出现奇怪的效果,就象我们刚才修改的那样。
如果,你坚持使用 GL_TRIANGLE_STRIP ,你只需要修改你的顶点数组,如下:constGLfloatstripSquare[] = {-1.0, -1.0, -6.0, // bottom left1.0, -1.0, -6.0, // bottom right-1.0, 1.0, -6.0, // top left1.0, 1.0, -6.0 // top right};因此,与上述情况,我们可以看到第一个三角形将形成头三个顶点,产生一个三角形如下:现在,通过指定点右上角顶点( P4),一个新的三角地带将形成与左上角工作( P3 )和第二前顶点(P2)这是右下角。
新的顶点显示为橙色,绿色和红色如下:结果是,那种方式都可以让我们生成一个矩形。
最终的结果是相同的。
但这些提醒我们,要注意保持你的顶点数组和你的绘制模式的一致。
最后。
现在,你已经知道如何生成三角形和矩形。
我的介绍没有包含点和线,因为它们比较简单。
在下一教程,我们将增加一些颜色。
一旦我们可以为我们的目标上色,我们可以移动他们,并且在3d中实现纹理映射。
虽然,它不会象Doom 3一样酷。
但你知道,你可以开始建立3d的物体,我将开始包含3d世界的知识。
原文的位置:/smaurice/AppleCoder/iPhone_OpenGL/Entries/ 2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares.html。