图形学基本概念

来源:互联网 发布:查看数据库出错的命令 编辑:程序博客网 时间:2024/06/05 00:52

(1)opengl-es:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。

OpenGL ES是一个状态机器,这意味着在一个程序中设置了一个配置值后,这个值会一直保持,直到程序修改了这个值。

(2)纹理:纹理是一个用来保存图像的颜色元素值的OpenGL ES缓存。在纹理的缓存中保存的颜色值可能要耗费很多的内存。所有的嵌入式系统都为纹理设定了内存的最大尺寸限制。所有的iPhone和iPad Touch版本都可以支持由1024×1024像素的图像生成的纹理。iPad和最新一代iPhone、iPod Touch所支持的尺寸甚至更大。但是,由于嵌入式系统的可用内存相对较小,应尽量使用最小的图像来产生可以接受的渲染结果。

当用一个图像初始化一个纹理缓存之后,在这个图像中的每个像素变成了纹理中的一个纹素(texel)。与像素类似,纹素保存颜色数据。像素和纹素之间的差别很微妙:像素通常表示计算机屏幕上的一个实际的颜色点,因此,像素通常被用来作为一个测量单位。说一个图像有256像素宽,256像素高是正确的。与此相反,纹素存在于一个虚拟的没有尺寸的数学坐标系中。图3-2显示了OpenGL ES 纹理坐标系中的一个纹理。

 

纹理坐标系有一个命名为S和T的2D轴。在一个纹理中无论有多少个纹素,纹理的尺寸永远是在S轴上从0.0到1.0,在T轴上从0.0到1.0。从一个1像素高64像素宽的图像初始化来的纹理会沿着整个T轴有1 纹素,沿着S轴有64 纹素。

注意本书中的例子使用的是2D 纹理,但是一些OpenGL实现还会支持1D和3D 纹理。一个1D的纹理就相当于沿着T轴只有1 纹素的2D 纹理,因此一个64 纹素的1D 纹理与从尺寸为64×1的图像初始化来的2D 纹理是相同的。3D 纹理就像一个层饼,一个在拥有R、S和T轴的坐标系中沿着R轴堆叠的多个2D 纹理的层饼。1D和3D 纹理对于某些特定的应用来说是非常方便的,但是2D 纹理是迄今为止最常见的。

(3)缓存

OpenGL ES为两个内存区域间的数据交换定义了缓存(buffers)的概念。缓存是指图形处理器能够控制和管理的连续RAM。程序从CPU的内存复制数据到OpenGL ES的缓存。在GPU取得一个缓存的所有权以后,运行在CPU中的程序理想情况下将不再接触这个缓存。通过控制独占的缓存,GPU就能够尽可能以最有效的方式读写内存。图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味着在GPU使用缓存中的数据工作的同时,运行在CPU中的程序可以继续执行。

几乎所有程序提供给GPU的数据都应该放入缓存中。缓存存储的到底是几何数据、颜色、灯光效果,还是其他信息并不重要。为缓存提供数据有如下7个步骤。

1)生成(Generate)—请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符。

2)绑定(Bind)—告诉OpenGL ES为接下来的运算使用一个缓存。

3)缓存数据(Buffer Data)—让OpenGL ES为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。

4)启用(Enable)或者禁止(Disable)—告诉OpenGL ES在接下来的渲染中是否使用缓存中的数据。

5)设置指针(Set Pointers)—告诉Open-GL ES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。

6)绘图(Draw)—告诉OpenGL ES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。

7)删除(Delete)—告诉OpenGL ES删除以前生成的缓存并释放相关的资源。

理想情况下,每个生成的缓存都可以使用一个相当长的时间(可能是程序的整个生命周期)。生成、初始化和删除缓存有时需要耗费时间来同步图形处理器和CPU。存在这个延迟是因为GPU在删除一个缓存之前必须完成所有与该缓存相关的等待中的运算。如果一个程序每秒生成和删除缓存数千次,GPU可能就没有时间来完成任何渲染了。

OpenGL ES为一种类型的缓存在使用过程中的每一个步骤的执行定义了下面的C语言函数,同时为其他类型的缓存提供了类似的函数。

glGenBuffers()—请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符。

glBindBuffer()—告诉OpenGL ES为接下来的运算使用一个缓存。

glBufferData() 或者glBufferSubData()—让OpenGL ES为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。

glEnableVertexAttribArray() 或者glDisableVertexAttribArray()—告诉OpenGL ES在接下来的渲染中是否使用缓存中的数据。

glVertexAttribPointer()—告诉OpenGL ES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。

glDrawArrays() 或者glDrawElements()—告诉OpenGL ES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。

glDeleteBuffers()—告诉OpenGL ES删除以前生成的缓存并释放相关的资源。

注意 这里提到的C函数只是为了描述OpenGL ES 2.0 API函数与基础概念的对应方式。全书会用各种例子讲解这类C函数,因此现在不用担心记不住它们。

(4)渲染

将数据搞成图像。

(5)帧缓存

GPU需要知道应该在内存中的哪个位置存储渲染出来的2D图像像素数据。就像为GPU提供数据的缓存一样,接收渲染结果的缓冲区叫做帧缓存(frame buffer)


0 0
原创粉丝点击