OpenGL ES应用开发实践指南(android 卷)笔记 第二章1

来源:互联网 发布:java 工程师 简历 编辑:程序博客网 时间:2024/05/19 02:20

第二章:定义顶点和着色器 1

1.在OpenGL里,只能绘制点,直线以及三角形。

2.三角形是最基本的几何图形;因为他的结构如此稳定,他随处可见,比如桥梁的结构化构件;他有三条边用来连接它的三个定点,如果我们拿掉其中的一个顶点,剩下的就是一条直线,如果我们再拿掉一个点,就剩下一个点了。

点和直线可以用于某些效果,但是,只有三角形才能用来构建拥有复杂的对象和纹理的场景。在OpenGL里,我们把单独的点放在一个组里构建出三角形,再告诉OpenGL如何连接这些点。我们想要构建的所有东西都要用点、直线、三角形定义;如果想构建更复杂的图形,例如拱形,那我们就需要足够的点拟合这样的曲线。

3.当我们定义三角形的时候,我们总是以逆时针的顺序排列顶点;这称为卷曲顺序(winding order)。因为在任何地方都使用这种一致的卷曲顺序,可以优化性能:使用卷曲顺序可以指出一个三角形属于任何给定物体的前面或者后面,OpenGL可以忽略那些无论如何都无法被看到的后面的三角形。

4.当我们在模拟器或者设备上编译和运行java代码的时候,它并不直接运行在硬件上的;相反,他运行在一个特殊的环境上,即Dalvik虚拟机(Dalvik virtual machine);运行在虚拟机上的代码不能直接访问本地环境(native environment),除非通过特定的API。

Davik虚拟机还使用了垃圾回收(garbage collection)机制。这意味着,当虚拟机检测到一个变量、对象或者其他内存片段不再被使用时,就会把这些内存释放掉以备重用;它也能腾挪内存以提高空间使用效率。

本地环境并不是这样工作的,他不期望内存块会被移来移去或者被自动释放。

Android之所以这样设计,是因为开发者在开发程序的时候不必关心特定的CPU或者机器架构,也不关心底层的内存管理。这通常都能工作的很好,除非要与本地系统交互,比如OpenGL。OpenGL作为本地系统库直接运行在硬件上,没有虚拟机,也没有垃圾回收或内存压缩。

5.Davik方案是Android的主要特点之一,但是,如果代码运行在虚拟机内部,那它怎么与OpenGL通信呢?有两种技术,第一种技术是使用java本地接口(JNI),这个技术已经由Android软件开发包提供了;当调用android.opengl.GLES20包里的方法时,软件开发包实际上就是在后台使用JNI调用本地系统库的。

第二种技术就是改变内存分配的方式,java有一个特殊的类集合,它们可以分配本地内存块,并且把java的数据复制到本地内存。本地内存可以被本地环境存取,而不受垃圾回收器的管控。

6.字节序(Endianness)是描述一个硬件架构是如何组织位(bit)和字节(byte)的方式,它们在底层组成一个数字。现实中,最常见的就是多字节数,即可以把它们按大头序(big endian order)排列,即把最重要的字节放在前面,或者按小头序(little endian order)排列,即把最不重要的字节放在前面。

举个列子,有个十进制数10 000,如果把它转成二进制数,就是100111 00010000。在大头的架构上,这些位就会排列成:

 00100111 00010000

在小头的架构上,它们就会排列为:

00010000 00100111

这次使用十六进制再来看一下。十进制数10 000就是十六进制系统中的2710;因为每两个字符对应一个8位字节,再看计算机代码时,十六进制用起来更好些;在大头的架构上,这个数字会另存为:

27 10

而在小头的架构上,同样的数字会另存为:

10 27

正常情况下,我们不需要担心字节序。当使用byteBuffer时,只需要保证它和硬件使用了同样的字节序;否则结构就会出现莫名其妙的错误。在wikipedia上有更多关于字节序的内容。

7.顶点着色器(vertex shader)生成每个顶点的最终位置,针对每个顶点,它都会执行一次,一旦最终位置确定了,OpenGL就可以把这些可见顶点的集合组装成点、直线以及三角形。

片段着色器(fragment shader)为组成点、直线或者三角形的每个片段生成最终的颜色,针对每个片段,它都会执行一次;一个片段是一个小的,单一颜色的长方形区域,类似于计算机屏幕上的一个像素。

一旦最后的颜色生成了,OpenGL就会把它们写到一块成为帧缓冲区(frame buffer)的内存块中,然后,Android会把这个帧缓冲区显示到屏幕上。

在着色器出现之前,OpenGL只能使用一个固定的方法集合控制很少而有限的事情,比如场景里有多少光线或者加多少雾,;这些固定的API很容易使用,但是它们很难拓展。你只能实现API提供的效果,而且仅此而已;几乎不能添加如卡通着色器一样的自定义效果。

随着时间的推移,底层的硬件有了很大提升;设计OpenGL的人意识到这些API需要演进,并跟上这些变化。在OpenGL ES 2.0里,他们使用着色器加入了可编程API;为了保持简洁,他们把那些固定的API完全删除了,因此,用户必须使用着色器。

我们现在用着色器控制每个顶点应该如何画到屏幕上,我们也控制所有点,直线和三角形的每个片段如何绘制;这打开了一个新的、充满了无限可能的新世界。我们现在可以按每个像素实现光照和其他优美的效果,如卡通着色。只要我们可以用着色器语言表达出来,就可以加入任何理想的自定义效果。








阅读全文
0 0
原创粉丝点击