OpenGL ES的从地上爬起来,第1部分:

我已经做了为iPhone编程的OpenGL ES张贴,但我所做的职位大多已在已经至少有一点点了解3D编程的人针对性,如果您有没有这样做抢我空的OpenGL Xcode项目的模板的副本。我们将使用这个模板作为一个起点,而不是苹果公司提供了一个的 。您可以安装,解压缩后的文件夹复制到这个位置:


/开发商/平台/ iPhoneOS.platform /开发/资源库/ Xcode中/项目模板/应用/

有一个良好的基于OpenGL的教程和书籍的数量。不幸的是,有很多的OpenGL ES,并没有(至少在我写这篇文章),是专门为iPhone上的学习3D编程设计。由于最可用的材料学习OpenGL出使用什么所谓教学开始直接模式,即了OpenGL的功能未在OpenGL ES的一部分,它可真的很难为一个iPhone开发没有3D背景起床和运行使用现有的书籍和教程。我已经要求它的人的数量,所以我决定开始了一系列绝对的3D初学者设计的博客文章。这是该系列中的第一。如果您已阅读并理解了我以前的OpenGL帖子,您可能会发现这个系列是有点太基本。

OpenGL的数据类型


我们将谈论的第一件事情是OpenGL的数据类型 。由于OpenGL是一个跨平台的API和数据类型的大小可以不同,取决于所使用的编程语言,以及底层的处理器(64位和32位和16位),OpenGL的声明了自己的自定义数据类型到OpenGL传递值时,你应该总是使用这些OpenGL的数据类型,以确保您所传递的权利的大小或精度值 。如果不这样做可能会导致意想不到的结果,或在运行时的数据转换造成的减速。每个OpenGL实现,无论平台或语言,标准的OpenGL的数据类型,声明在这样一种方式,他们将在每一个平台的同样大小的OpenGL代码从一个平台移植到另一个更容易,下面是OpenGL ES的数据类型:


  • GLenum:GL具体枚举使用一个无符号整数。最常用的告诉OpenGL的指针(例如通过一个数组中存储的数据类型 GL_FLOAT)表示,该阵列由 GLfloat号
  • GLboolean:用于举行一个布尔值。OpenGL ES的还宣布了自己的真假值 GL_TRUE  GL_FALSE),以避免平台和语言的差异 。当传递到OpenGL的布尔值,使用这些而不是YESNO(尽管它不会伤害,如果你不小心使用 YES或正确的 ,因为他们实际上是相同的定义,但它的好形式,使用GL定义的值。
  • GLbitfield:这是四个字节的整数,用于多个布尔值(最多32个)打包成一个单一的变量使用按位运算符 。我们将讨论这是我们第一次使用一个位域变量,但你可以阅读的基本思路,在维基百科
  • GLbyte:一个签名,一个字节的值从-128到127的整数
  • GLshort:一个签署的两个字节的持有价值-32,768到32,767之间的整数
  • 闪烁:有符号的四字节整数持有-2,147,483,648到2,147,483,647之间的数值
  • GLsizei:一个签名,四字节的整数,用来表示数据的大小(以字节为单位),类似为size_t在C
  • GLubyte:一个无符号字节的整数,能够持有0和255之间的值。
  • GLushort:一个无符号两个字节的整数,能够举行0到65,535之间的值
  • GLuint:一个无符号的四字节整数,能够持有一个介于0和4294967295的价值
  • GLfloat:一个四个字节的精度IEEE 754-1985浮点变量 。
  • GLclampf:这也是一个四字节的精度浮点变量,但OpenGL的使用GLclampf,它是表明这个特定变量的值应始终介于0.0和1.0 。
  • GLvoid:一个void值,用来表示一个函数没有返回值,或者不带任何参数 。
  • GLfixed定点数字是实数,使用整数存储的一种方式。这是一个常见的优化使用三维系统,因为大多数电脑的处理器速度比浮点变量与整数的数学 。因为iPhone的向量处理器,OpenGL的使用做快速浮点运算,我们将不讨论定点算术运算或数据类型GLfixed
  • GLclampx:另一个定点的变量,用来表示0.0和1.0之间的实数,使用定点算术。GLfixed一样,我们不会使用或讨论这个数据类型。


OpenGL ES的(至少在iPhone上使用的版本)不支持任何8字节(64位)数据类型,如long double 。OpenGL并有较大的数据类型,但由于大多数嵌入式设备的屏幕大小,你很可能要为他们写的应用程序的类型,作出决定,排除的OpenGL ES的假设下,他们将有一点需要他们使用他们,这可能对性能有不利影响。

点或顶点


在三维图形的原子单位称为顶点 。这些代表在三维空间中的一个单点,并用来建立更复杂的对象。多边形打造出来的这些点,并建立多个多边形对象。虽然经常OpenGL支持多种类型的多边形,OpenGL ES的只支持使用三个边的多边形,(又名三角形),如果你还记得高中学几何,您可能还记得称为直角坐标系其基本思路是,您选择了一个在太空中的任意点,并调用的起源。然后,您可以指定所引用的来源和使用三个数字,每个的三个层面之一,这是代表三个假想线通过原点运行在太空中的任何一点 。运行由左到右的假想线称为x轴 。沿X轴,你去沿x轴向右,价值越来越高,你去左边,他们获得较低。左边的起源是负的x值,和的权利,是积极的 x值。另外两个轴的工作方式完全相同。沿y轴,y的增加值,并不断下降,但下降。以上原点的值有一个积极的Y值,并低于原点的负y值。以Z,物体移动远离观察者,价值得到较低,作为他们向观众(或继续后面的观众)移动,价值观得到更高。点在前面的起源有一个积极的Z值,和那些背后的起源有一个负的Z值。下面的插图可能帮助这些话使一些更有意义:


cartesian.png


注:核心图形,这是另一个在iPhone上使用一种稍微不同的坐标系,Y轴下降,因为它从产地,并增加它下沉图形的框架。



沿着这些轴,增加或减小该值是一个任意规模-他们并不代表任何实际测量,如英尺,英寸或米。您可以选择任何规模,使你自己的程序意识。如果你想设计一个游戏,其中每个单元是一个脚,就可以做到这一点。如果你想使每个单位微米,你也可以做。的OpenGL并没有关心什么,他们代表的最终用户,它只是认为他们为单位,并确保他们是所有相等的距离。由于任何对象的三维空间中的位置可以是由三个值代表,一个对象的位置是一般在OpenGL代表由三个GLfloat变量使用,通常使用三个浮点数的数组,数组中的第一项(索引0)是x的位置,第二个(指数1)是y的位置 ,和第三(索引2)Z位置。这里有一个很简单的例子,创建一个顶点在OpenGL ES使用 :



    GLfloat顶点[ 3 ] ; 
顶点[ 0 ] = 10.0 ; / / x
顶点[ 1 ] = 23.75 ; / / Ÿ
顶点[ 2 ] = - 12.532 ; / / ž



在OpenGL ES,您通常会提交弥补您作为一个场景中的对象的部分或所有的顶点数组的所有顶点。仅仅是一个顶点数组数组值(通常GLfloat),包含在世界中的对象的部分或全部的顶点数据。我们将看到如何在本系列的下一篇文章的过程中,但要记住顶点数组的东西是他们的大小是根据提交乘以分为三顶点的数目(在三维空间绘图) 或两个(在两维空间绘图)。所以,拥有6个在三维空间中的三角形的一个顶点数组组成阵列GLfloat小号54,因为每个三角形的三个顶点,每个顶点有三个坐标和6 × 3 × 3 = 54,所有这些交易GLfloat S可以是一个痛苦,但是,因为你不断乘以在你的脑袋的事情,并尝试在他们所代表的顶点和多边形的这些阵列认为的。幸运的是,还有一种更简单的方法 。我们可以定义一个数据结构来保存一个顶点,像这样:

typedefstruct{ GLfloat x; GLfloat y; GLfloat z;} Vertex3D;


通过这样做,我们的代码变得更加可读:

Vertex3D顶点; 
vertex.x = 10.0 ;
vertex.y = 23.75 ;
vertex.z = - 12.532 ;


现在,因为我们Vertex3D的结构是由三个 GLfloat小号,传递一个指针,指向一个 Vertex3D是完全为三个数组指针传递到一个相同 GLfloat 有没有计算机的区别,都具有相同的尺寸和相同数量的字节顺序相同的OpenGL预计他们 。到这些数据结构的分组数据,使得它更容易为我们作为程序员,可视化和处理数据 。如果您从本文开头的,这个数据结构和配套功能,我将要讨论未来我的Xcode模板已经被定义在命名文件 OpenGLCommon.h。还有一个用于创建单一顶点的内联函数 :

staticinline Vertex3DVertex3DMake(CGFloat inX, CGFloat inY, CGFloat inZ){ Vertex3D ret; ret.x = inX; ret.y = inY; ret.z = inZ;return ret;}








如果你还记得几何(或也许你不,这是没问题),在一个平面上的两个点之间的距离是使用这个公式计算: 

distance formula.png



我们可以实现这个公式来计算这个简单的内联函数在三维空间中的任何两个点之间的直线距离:

staticinline GLfloatVertex3DCalculateDistanceBetweenVertices(Vertex3D first, Vertex3D second){ GLfloat deltaX = second.x - first.x; GLfloat deltaY = second.y - first.y; GLfloat deltaZ = second.z - first.z;returnsqrtf(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ );};







三角形


由于OpenGL ES的支持三角形,我们也可以创建一个数据结构组三个顶点成一个三角形对象。

 typedefstruct{ Vertex3D v1; Vertex3D v2; Vertex3D v3;} Triangle3D;



同样,一个单一的Triangle3D,正是九数组相同 GLfloat小号,它只是我们更容易地处理它在我们的代码,因为我们可以构建对象的顶点和三角形阵列,不是GLfloat条有一些事情你需要了解三角形的,但是。在OpenGL中,有一个概念,称为绕组,这只是意味着顶点的顺序是绘制的事项 。在现实世界中的对象不同,在OpenGL中的多边形不一般都有他们双方。他们一边,这被认为是前脸,如果其前脸面对观众只能看到一个三角形。虽然可以配置OpenGL来对待两个片面的多边形,默认情况下,三角形只有一个可见的一面。知道这是多边形的前面或不可见的一面,OpenGL是能够做到的一半量计算每个多边形的,它会做,如果双方都可见。,虽然有时间时会站在自己的多边形, ,你很可能还有希望的背面绘制一个三角形通常是一个较大的物体的一部分,和多边形的一侧将要面对的对象的内部,将永远不会被看到。不绘制的一面是所谓背面,和OpenGL的决定,这是要绘制的前脸,这是由顶点的绘制顺序 ,背面。前脸是按照逆时针的顺序(默认情况下,它可以改变)的顶点,将要绘制一个。由于OpenGL可以很容易判断该三角形是对用户可见,它可以使用这个过程被称为背面拣选避免这样做没有面临的视前方,因此,不能被看作多边形的工作 。我们将讨论在未来发布的视口,但你可以把它看作是虚拟摄像头,或进入了OpenGL世界的虚拟窗口 。





winding.png



在上图中,左侧的青色三角形是背面,并不会因为将在观众绘制顶点的顺序是顺时针绘制。另一方面,在右边的三角形是因为顶点的顺序是逆时针的观众将绘制frontface在未来张贴在本系列中,我们将看看设立虚拟OpenGL中的世界,做一些简单的绘图,使用
在Vertex3D和Triangle3D上图,青色三角形剔除左边的这幅图像是不会被吸引,因为,以便将应画在顶点与观众是顺时针方向转动的。另一方面,三角右边的是frontface将被吸引,因为顶点的顺序关系是逆时针方向旋转观赏者。      在接下来的张贴在这个系列,我们将看看设置虚拟世界,做一些简单的绘图开放式绘图介面使用Vertex3D和Triangle3D。在文章之后,我们将看看变换是线性代数的使用方式移动物体围绕在虚拟世界里。

原文地址:https://www.cnblogs.com/pinping/p/2139118.html