没有合适的资源?快使用搜索试试~ 我知道了~
西蒙iphone-OpenGL+ES(高清版)
需积分: 10 7 下载量 129 浏览量
2013-10-16
11:55:12
上传
评论
收藏 2.05MB PDF 举报
温馨提示
试读
128页
不多说,绝对的好资料!网上有看到的,下载的分数要得太多了,我再传一个,供大家学习!
资源推荐
资源详情
资源评论
西蒙iphone-OpenGL ES 教程-01| 游戏开发讨论区 - Cocoa China 开发讨论区 最热的Mac开发论坛 | 最热的iPhone开发论坛 | 最热的iPad开发论坛 - powered by...
http://www.cocoachina.com/bbs/read.php?tid-5506-fpage-10.html[10-5-2 ••08:07:26]
上一主题 下一主题 « 1 2 » Pages: 1/2 Go
使用道具 复制链接 | 浏览器收藏 | 打印
无图版 左右分栏 风格切换 帮助 Home首页 论坛首页
用户名
热门版块: 苹果开发者综合议事大厅
App Store上线/推广/销售讨论区
iPhone开发 / iPad开发 新手提问区
iPhone开发 / iPad开发 一般讨论区
人才招聘/应聘求职/交易/宣传区
Unity for iPhone引擎开发(试运行)
ally1981
级别: 侠客
楼主 发表于: 2009-06-29 17:43
西蒙iphone-OpenGL ES 教程-01
受到花生大大的鼓励,继续努力翻译给大家看
西蒙iphone-OpenGL ES 教程
图元是构成复杂物体的基本绘图要素。在OpenGL ES中,你可以使用的图元有点,线
,三角形。它们都有非常强的自我解释性,我觉得你需要有些例子让你看到它们。
首先,让我们来看看一些代码,然后我们可以谈论这是怎么回事,这样您就可以使用
它来创建一些自己的代码。
图元 #1 - 三角形
三角形是最“复杂”的图元,但是很容易使用,并且非常实用,这将是你可以绘制的第一
个OpenGL的图元。当我们绘制一个三角形的时候,我们需要告诉OpenGL在3d空间中
的三角形的3系坐标,并且,OpenGL将非常顺利的渲染这个三角形。
在开始之前,复制00教程中的项目代码或者从这里下载下项目代码: AppleCoder-Op
enGLES-00.tar.gz .在XCode中打开,开启EAGLView.m文件,找到drawView函数。
这里就是施展魔法的地方。
只看楼主 | 小 中 大
讨论区
推荐 搜索
社区服务 博客 朋友圈
登录 注册
Cocoa China 开发讨论区 游戏开发讨论区 西蒙iphone-OpenGL ES 教程-01
输入用户名
登 录
西蒙iphone-OpenGL ES 教程-01| 游戏开发讨论区 - Cocoa China 开发讨论区 最热的Mac开发论坛 | 最热的iPhone开发论坛 | 最热的iPad开发论坛 - powered by...
http://www.cocoachina.com/bbs/read.php?tid-5506-fpage-10.html[10-5-2 ••08:07:26]
首先,我们需要定义一个三角形。要做到这点,我们需要知道在我们要处理的坐标的
两种类型:模型和世界。模型坐标是指我们正在绘制的实际图元,世界坐标告诉Open
GL观察者在哪里。(在世界坐标中,观察者一般在(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的,对于初学者来说,我会简要的描述三
维坐标系统。看看这张图片:
西蒙iphone-OpenGL ES 教程-01| 游戏开发讨论区 - Cocoa China 开发讨论区 最热的Mac开发论坛 | 最热的iPhone开发论坛 | 最热的iPad开发论坛 - powered by...
http://www.cocoachina.com/bbs/read.php?tid-5506-fpage-10.html[10-5-2 ••08:07:26]
对于我的绘画技巧,我深表遗憾。不过这个图代表了模型空间和世界空间。 试想一下
,这是您的计算机屏幕, 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的位置上。
绘制函数:
西蒙iphone-OpenGL ES 教程-01| 游戏开发讨论区 - Cocoa China 开发讨论区 最热的Mac开发论坛 | 最热的iPhone开发论坛 | 最热的iPad开发论坛 - powered by...
http://www.cocoachina.com/bbs/read.php?tid-5506-fpage-10.html[10-5-2 ••08:07:26]
所以我们这样做是为了说明目前的三角形。我们现在需要告诉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行代码就是我们渲染一个三角形的。让我们从上往下一行行的打断这些
代码来分析,你会发现它们是非常的简单。
西蒙iphone-OpenGL ES 教程-01| 游戏开发讨论区 - Cocoa China 开发讨论区 最热的Mac开发论坛 | 最热的iPhone开发论坛 | 最热的iPad开发论坛 - powered by...
http://www.cocoachina.com/bbs/read.php?tid-5506-fpage-10.html[10-5-2 ••08:07:26]
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
这行代码只是简单的清除了屏幕。这个控制位告诉OpenGL,我们使用上次教程里面se
tupView函数中设置的颜色(黑色)来清除屏幕,并且清除了深度缓冲。 请注意,如果
我们没有创建深度缓冲和开启深度缓冲(如我们应该做的),这个屏幕将不会渲染。如
果我们不使用深度缓冲,我们将不需要通过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程
序像搅拌机。
4.Pointer to the Data – 数据本身,正是因为它,三角形才会出现。
因此,我们告诉OpenGL清除缓冲区,告诉它的数据是我们的目标和它的格式,现在我
们需要告诉OpenGL的东西很重要:
剩余127页未读,继续阅读
资源评论
u010186280
- 粉丝: 4
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功