通过这样做,我们的代码可读性更强:
Vertex3D vertex;
vertex.x = 10.0;
vertex.y = 23.75;
vertex.z = -12.532;
现在由于Vertex3D由三个GLfloat组成,向Vertex3D传递指针与向数组传递一个包含三个GLfloat的数组的指针完全一样。对于电脑而言毫无分别;两者具有同样的尺寸和同样的字节数以及OpenGL需要的同样的顺序。将数据分组到数据结构只是让程序员感到更容易,处理起来更方便。如果你下载了文章开头处的Xcode模板,你会发现此数据结构以及我后面将讨论的各种函数都定义在文件OpenGLCommon.h中。还有一个内联函数用于创建单个顶点:
static inline Vertex3D Vertex3DMake(CGFloat inX, CGFloat inY, CGFloat inZ)
{
Vertex3D ret;
ret.x = inX;
ret.y = inY;
ret.z = inZ;
return ret;
}
如果你回忆起几何学(如果不记得也不要紧)的内容,你会知道空间中两点间的距离是使用下面公式计算的:
我们可以在一个简单的内联函数中实现这个公式来计算三维空间中任何两点间的直线距离:
static inline GLfloat Vertex3DCalculateDistanceBetweenVertices (Vertex3D first, Vertex3D second)
{
GLfloat deltaX = second.x - first.x;
GLfloat deltaY = second.y - first.y;
GLfloat deltaZ = second.z - first.z;
return sqrtf(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ );
};
三角形
由于OpenGL ES仅支持三角形,因此我们可以通过创建一个数据结构将三个顶点组合成一个三角形物体。
typedef struct {
Vertex3D v1;
Vertex3D v2;
Vertex3D v3;
} Triangle3D;
一个 Triangle3D实际上与一个九个GLfloat构成的数组是完全一样的,因为我们通过顶点和三角形而不是GLfloat数组来构建物体,所以它能帮助我们更容易地处理我们的代码。
然而关于三角形你需要知道更多的事情。在OpenGL中有一个概念叫卷绕(winding), 它表示顶点绘制的次序是重要的。不像真实世界中的物体,OpenGL中的多边形通常都不会有两面。它们只有一面,被当做front face(前面), 三角形只有其front face面对观察者时才可见。可以设置OpenGL将多边形作为两面处理,但默认状态下,三角形只有一个可见面。通过知道哪一个面是多边形的前面或可见面,才能使OpenGL只做一半的计算。
尽管有时多边形也可以独立存在,需要绘制其背面,但通常三角形是一个大物体的一部分,其面对物体内部的一面永远也不可见。不被绘制的一面称为backface(背面),OpenGL是通过观察顶点的绘制次序来确定front face和backface的。以反时针次序绘制顶点的构成的面是frontface(默认,可以改变)。由于OpenGL可以很容易确定哪个三角形对用户可见,所以它使用了一种称为Backface Culling(隐面消除) 的技术来避免绘制视窗中多边形的不可见面。下一篇文章将讨论视窗,现在你可将其想象成一个虚拟摄像或观察OpenGL世界的虚拟窗口。
上图中,左边青色的三角形是backface,因此将不可见。而右方的三角形是frontface,所以将被绘制。
本系列的下一篇文章将设定一个OpenGL的虚拟世界并使用Vertex3D 和 Triangle3D进行一些基本绘图。再后,我们将讨论变换,它使用线性代数在虚拟世界中移动物体。
相关推荐
本文将从零开始,详细介绍如何学习OpenGL ES,以及如何利用提供的模板进行快速入门。 首先,我们要理解OpenGL ES的基础概念。OpenGL ES 提供了一个跨平台的编程接口,用于创建2D和3D图形。它包含了一系列函数调用,...
从零开始学习OpenGL_ES 网页文件
本教程将从零开始,带你深入理解OpenGL ES项目的构建和运行,帮助你开启图形编程之旅。 在"Empty.OpenGL.ES.Application.zip"这个压缩包中,你可能会找到以下核心文件和目录,它们是构成一个基本OpenGL ES应用的...
iphone上学习opengles的必备资料,完全零基础开始学习
OpenGL ES(Open Graphics ...总结而言,学习OpenGL ES从零开始需要掌握其核心概念、数据类型、坐标系统以及对3D图形的处理。在移动和嵌入式平台的应用开发中,这些知识点是构建流畅、高效3D图形应用程序的基础。
泰然论坛翻译的 OpenGL ES 从零开始系列 文章源码,由于是很早之前的,原连接失效了。 找了很久才找到的,是目前最齐全的。总共7个DEMO, 涵盖了总共9章的内容
1. "从零开始学习OpenGL+ES"系列:讲解OpenGL ES的基本概念和编程基础。 2. "opengl-es画图步骤":详细介绍OpenGL ES绘制图形的完整流程。 3. "实验6——图形绘制与OpenGL_ES":提供实际的编程练习,加深理论知识的...
OpenGLES 3.0从零开始,绘制点、线、三角形、立方体,相机实时预览等等实践学习 android平台opengles3.0实践学习 android平台下OpenGLES3.0从零开始 android平台下OpenGLES3.0绘制纯色背景 android平台下OpenGLES3.0...
学习iphone openGL_ES从这里开始!这是一本关于iphone openGL_ES的入门书,从最基本的开始讲起,只要你看了,那么就能掌握openGL_ES的内容。这真是一本好书,我的openGL_ES就是从这里开始的。(中文版)
教程名称:OpenGL ES经典教程大全课程目录:【】Android应用OpenGLES制作3D图像【技术文档】【】OpenGL ES 2.0 官方手册【】OpenGL ES ...从零开始学习Open 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
本教程旨在帮助开发者从零基础开始掌握OpenGLES 2.0,并通过实例Demo加深理解。 入门篇: 1. **环境配置**:首先,你需要安装Android Studio并创建一个新的Android项目。然后,在项目的build.gradle文件中添加对...
这篇详细的教程将带你从零开始学习Android游戏编程,并提供源码供你参考和实践。我们将会深入探讨以下几个关键知识点: 1. **Android基础知识**:首先,你需要熟悉Android开发环境,包括安装Android Studio、设置...
开发者可以通过这个模板,将重心放在开发应用程序的特定部分,而非从零开始构建基础框架。一旦创建了项目,开发者需要保存它,这是开始任何开发项目的基础步骤。 深度缓冲(Depth Buffer)的概念和启用 教程中提到...
为了更好地理解 OpenGL ES 的工作原理,我们将从零开始搭建一个简单的 OpenGL ES 项目。这里以 Xcode 为例: 1. **创建项目**:打开 Xcode,新建一个 Window-based Application 项目,命名为 "HelloOpenGL"。 2. **...
对于初学者来说,这是一个非常宝贵的资源,因为可以直接动手实践,而无需从零开始编写代码。通过实际操作,学习者可以更好地理解OpenGLES的API调用、渲染流水线、纹理映射、光照处理等核心概念。 OpenGLES的核心...