没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
西蒙 iphone-OpenGL
iphone-OpenGL
iphone-OpenGL
iphone-OpenGL ES
ES
ES
ES 教程
西蒙
西蒙
西蒙
西蒙
iphone-OpenGL
iphone-OpenGL
iphone-OpenGL
iphone-OpenGL ES
ES
ES
ES
教程
教程
教程
教程
-01
-01
-01
-01
受到花生大大的鼓励,继续努力翻译给大家看
西蒙 iphone-OpenGL ES 教程
图元是构成复杂物体的基本绘图要素。在 OpenGL ES 中,你可以使用的图元有点,线 , 三
角形。它们都有非常强的自我解释性,我觉得你需要有些例子让你看到它们。
首先 , 让我们来看看一些代码 , 然后我们可以谈论这是怎么回事 , 这样您就可以使用它来创
建一些自己的代码。
图元 # 1 - 三角形
三角形是最 “ 复杂 ” 的图元 , 但是很容易使用 , 并且非常实用 , 这将是你可以绘制的第一个 Op
enGL 的图元 。 当我们绘制一个三角形的时候 , 我们需要告诉 OpenGL 在 3d 空间中的三角形
的 3 系坐标,并且, OpenGL 将非常顺利的渲染这个三角形。
在开始之前 , 复制 00 教程中的项目代码或者从这里下载下项目代码 : AppleCoder-OpenGLE
S-00.tar.gz . 在 XCode 中打开,开启 EAGLView.m 文件,找到 drawView 函数。这里就是施
展魔法的地方。
首先 , 我们需要定义一个三角形 。 要做到这点 , 我们需要知道在我们要处理的坐标的两种类
型 : 模型和世界 。 模型坐标是指我们正在绘制的实际图元 , 世界坐标告诉 OpenGL 观察者在
哪里 。 (在世界坐标中,观察者一般在( 0.0,0.0,0.0 )的地方)
第一个例子将说明这点。首先,我们定义这个三角形在模型空间使用 3 x 3d 坐标( x,y,z )
:
const GLfloat triangleVertices[] = {
0.0, 1.0, -6.0,// Triangle top centre
-1.0, -1.0, -6.0,// bottom left
1.0, -1.0, -6.0,// bottom right
};
如上所示,这里使用了 3 个坐标来表示一个三角形,需要注意的是,我们定义三角形顶点是
逆时针来显示的 。 虽然描述三角形的可以用逆时针也可以用顺时针 , 但是我们必须和上述一
样用逆时针来描述三角形 。 不过 , 我建议你用逆时针来描述三角形 , 因为我们以后可以用逆
三角形来达到一些先进的功能。
(补充:逆三角形在 3d 中被认为是正面,而顺三角形则被认为是反面。在纹理渲染中被使
用到)
虽然本教程应该是纯粹的 iPhone OpenGL ES 的 , 对于初学者来说 , 我会简要的描述三维坐
标系统。看看这张图片:
对于我的绘画技巧,我深表遗憾。不过这个图代表了模型空间和世界空间。 试想一下,这
是您的计算机屏幕, X 和 Y 的横向和纵向的,你应该预料到, Z 表示深入。这个中心位
置就是 (0.0,0.0,0.0).
所以,看我们的三角形中所描述的顶点上述情况,第一点( 0.0 , 1.0 , -6.0 )中心将
在的 Y 轴 , 上涨 1 点 , 在屏幕的深度为 6 点 。 第二个坐标是右边的 Y 轴 1.0 点 , 低于 X 轴 ( 因
此 -1.0 的 Y 值) ,仍然回到屏幕 -6.0 点。这同样适用于第三个坐标。
为此 , 我们确定目标在我们眼睛之前 (z 值是负的 ), 所以这个目标是可见的 ( 记得吗 , 观察者
或者说照相机是在 ( 0.0 , 0.0 , 0.0 ) 的位置上 ) 所以说 OpenGL 的深度测试是失败的并且它
没有被渲染。
我可以听到你尖叫 “ 嘿,我还以为你说,这是模型坐标不是世界坐标! ” 。 是的,这是对
的,但是,当我们去渲染这个三角形之前, OpenGL 的将只是把对象放在( 0.0 , 0.0
,
0.0 ) 的位置上 。 因此 , 我们将它放到屏幕内才可见 。 当我们进入转换 ( 移动 , 旋转等
)
, 您会看到 , 您将不必设置对象 Z 值为负 , 也可以使之可见 。 在此之前 , 让目标的 Z 坐标
在 -6.0 的位置上。
绘制函数:
所以我们这样做是为了说明目前的三角形。我们现在需要告诉 OpenGL ,数据保存在哪里
,
以及如何去绘制它 。 这个过程只需要很少的几行代码 。 回到 drawView 函数 , 并且实行以下
的代码:
- (void)drawView {
const GLfloat triangleVertices[] = {
0.0, 1.0, -6.0, // Triangle top centre
-1.0, -1.0, -6.0, // bottom left
1.0, -1.0, -6.0 // bottom right
};
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);
// -- BEGIN NEW CODE
glClear(GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT);
glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);
// -- END NEW CODE
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
[self checkGLError:NO];
}
如你所见,这 4 行代码就是我们渲染一个三角形的。让我们从上往下一行行的打断这些代码
来分析,你会发现它们是非常的简单。
glClear(GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT);
这行代码只是简单的清除了屏幕 。 这个控制位告诉 OpenGL , 我们使用上次教程里面 setupV
iew 函数中设置的颜色(黑色)来清除屏幕,并且清除了深度缓冲。 请注意,如果我们没
有创建深度缓冲和开启深度缓冲(如我们应该做的) , 这个屏幕将不会渲染。如果我们不使
用深度缓冲,我们将不需要通过 glClear() 里的 GL_DEPTH_BUFFER_BIT.
因此,我们无论是清除以前绘制的这个缓冲区(请记住,这是双重缓冲动画 ; 利用一个缓冲
区而另一个缓冲区显示) 。
glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
此 函数告诉 OpenGL 的情况下我们的数据是什么格式 , 它是有 4 个参数 , 这个功能是很简单
细分:
1.Size- 这个值表示了每个坐标有几个数字。我们现在是 3 ,是因为是 3d 坐标 (x,y,z). 如果我们
使用 2d 绘制,不加入深度 ( 就是 z), 我们只要在这里写 2 就可以了。
2.Data Type- GL_FLOAT 意味着我们用 float 点值。 您也可以使用整数值,但如果你想你
需要习惯于使用浮点值的 3D 世界的浮点运算。
3.Stride - 这个 stride 告诉 OpenGL 在每个坐标之间忽略哪几个点。别对这个表示疑惑 , 保
持它是 0 就行了。你使用它
当您载入顶点数据文件的格式有更多的填充数据或肤色的数据,也就是说,一个 3D 程序像
搅拌机。
剩余125页未读,继续阅读
资源评论
- mouze20062012-07-25谢谢,对初学者很有帮助
- macro7762013-03-10西蒙的教程的翻译本,译得质量还行,有点没头没尾的感觉
- a900371062013-06-06iphone OpenGL es 的好书,适合入门
阿磊2013
- 粉丝: 95
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功