OpenGL图形编程(一)

来源:互联网 发布:数码宝贝网络侦探初始 编辑:程序博客网 时间:2024/05/16 09:13

概要:
1、图形和渲染简介
2、shader和GLSL
3、OpenGL简介

我们在屏幕上看见的所有东西,都可以简单的看成是以二维数组格式存储的像素(pixels)。

上图中,每一个方块是一个像素(pixel),注:pixel一词来源于“Picture Element”。我们把pixels组成的二维数组叫做image。
既然我们看到的图形只是二维pixels数组,那怎么表现出3D世界?3D图形学就是通过一系列的转换计算改变这些像素的颜色,让我们以为在屏幕上看到的是3D的世界,这个过程叫做渲染(rendering)。通过显卡做这些3D转换的过程,叫做光栅化(rasterization)。在光栅化过程中,所有物体都被看成是一个空壳,所有的空壳都是由不共线的三角形组成(因为三角形的三个顶点一定是共面的);如果离得很近去看,每一个看似圆形的面,都是由许多小的三角形组成的。组成一个物体的一系列三角形通常被叫做 模型(model)或 网格(mesh)。

光栅化有好几个阶段,这些阶段是在一个被叫做管线(pipeline)的东西里进行的:在管线上面放进去三角形数据,然后从下面出来2D的图形。这些三角形是以放入的顺序,一个一个画出来的。

OpenGL是一种访问光栅化过程的API。

光栅化过程总览:
1、裁剪空间转换(Clip Space Transformation)
光栅化的第一步,就是把所有的顶点转换到一个特殊的有限区域的空间里,在这个空间里的物体会被渲染,空间之外的则不会被渲染。这块空间,在OpenGL里,叫做裁剪空间(Clip Space),区域外的三角形会被抛弃,有一半在区域内的三角形会被“裁剪”成多个包含在空间内部的小三角形;空间里的三角形每个顶点的位置,我们称之为裁剪坐标(clip coordinates)。
裁剪坐标和常规的三维坐标有一点点不同的是,它有4个坐标:除了XYZ坐标,还有一个W坐标,这个坐标通常代表裁剪空间相对于这个点的坐标的长度(听起来有些别扭,其实不难理解,我们往后看)。
一个三角形的每个顶点对应的裁剪空间有可能是不同的,这个区域在XYZ方向的范围都是[-W,W],所以,具有不同W坐标的点,他们是村存在于不同的裁剪空间的。
在裁剪空间里,+X指向右,+Y指向上,而+Z指向远方。
2、标准坐标系(Normalized Coordinates)
裁剪空间因为有不用的W长度,所以计算起来很不方便。所以,我们要把裁剪坐标转换到一个更合理的坐标系 标准设备坐标系(normalized device coordinates);这个转换很简单,就是把每个顶点的XYZ除以W。其实,标准设备坐标系,就是裁剪坐标系,只是XYZ的范围都变成了标准的[-1,1]。

3、窗口转换(Window Transformation)
光栅化的下个过程,还是要对顶点做一些转换,从标准坐标系转换到和OpenGL正在运行的窗口有关的窗口坐标系。
这里,虽然和窗口有关了,但这些点,还都保留着3D的坐标:X向右,Y向上,Z向远方。窗口坐标系和裁剪坐标系唯一区别是,边界不同了:窗口坐标系的Z [0,1],在这之外的点不能显示出来;X和Y取决于当前运行OpenGL窗口的大小,XY坐标系的原点在左下角。
4、光点转换(Scan Conversion)
这个过程根据三角形盖住窗口上像素的程度,把三角形以像素的形式显示出来。这个过程只用到了X和Y坐标,Z坐标的作用,我们后面会提到。

三角形经过光点转换之后得到的结果,是一系列覆盖这个三角形形状的片段(fragments),每个片段都有与之相关的窗口坐标系XY和Z坐标。
5、片段处理(Fragment Processing)
这个阶段,会把上阶段的片段转换成一个或多个颜色值 和 一个深度值,单个三角形产生的所有片段处理顺序是无序的,或者说是互不相干的(这里应该是并行处理的)。但是,因为不同三角形之间可能会有遮盖,所以,来自不同三角形的片段,不能同时处理,一个三角形的所有片段处理完之后,才能处理下一个三角形片段。这个阶段我们通过OpenGL API可以参与很大一部分过程,具体的细节后面再详解。
6、片段写入(Fragment Writing)
这个阶段,带有颜色和深度的片段会经过很多的计算,然后写入image。
到这里光栅化过程就结束了。


shader是用来在渲染操作某个阶段运行的一段程序。
GLSL(OpenGL Shading Language)是OpenGL的主要shader语言。语法很像C,但是和C语言也有很多不同。


OpenGL可以理解成一套API(其实严格的说,是一套标准,或文档),有很多种语言的实现,但底层实现都依赖于C API。
OpenGL被设计成一个状态机,几乎所有的function都是改变或返回某个特定状态。唯一例外是那些直接引起渲染的方法。
关于OpenGL版本:OpenGL有很多个version的规范,但大多数情况下最新的API都能向下兼容旧的API,唯一的例外是3.0版本,这个版本把很多旧版本的function 标记成了 deprecated (不推荐使用的),并且在3.1版本里,删除了这些function。这样,就产生了2个规范,核心规范和通用规范(保留了3.1删除的functions),但是我们不用担心,没有哪个OpenGL驱动开发者会只实现驱动的核心规范,所以,可以认为,所有opengl版本都是向下兼容的。
这个系列的OpenGL文章,要求硬件最低需要支持OpenGL version 3.3。需要GeForce 8xxx 以上显卡,或者 Radeon HD 系列显卡。这些卡也是支持“Direct3D 10”的卡。
0 0
原创粉丝点击