2.1.4 坐标系统工具箱
窗口大小变化时,在glutReshapeFunc()中注册的汉莎会被调用,在回调函数中,完成下列任务:
重新建立一个矩形区域,把它作为新的渲染画布。
定义一个用于绘制物体的坐标系统。
2.1.5 点,线,多边形
点:所有的顶点都是用4个浮点坐标值来表示的(x,y,z,w)w默认是1.0.
线:直线这个术语一般表示一段线段。
多边形:几个点连在一起就是一个多边形,可以填充内部,也可以只绘制边框。
矩形:OpenGL特别提供了填充矩形图元函数glRect*(),
void glRect {sifd}(TYPE x1,TYPE y1,TYPE x1,TYPE y1);绘制由(x1,y1),(x2,y2)构成矩形,并且与x轴和y轴平行。
glVertex3d(GLdouble x, <#GLdouble y#>, <#GLdouble z#>) 表示一个顶点坐标
如下代码绘制一个多边形
void RenderScene(void)
{
glBegin(GL_POLYGON);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, .5);
glVertex2f(.3, .7);
glVertex2f(.45, .5);
glVertex2f(.6, 0.3);
glEnd();
glutSwapBuffers();
}
在opengl中只有点线和三角形,一些复杂的图形都是由他们堆砌而成。
将输入图元的数学描述转化为与屏幕位置对应的像素片元的过程称为光栅化。
渲染(render):计算机从模型创建最终图像的过程。
OpenGL 另一个最本质的概念叫做着色器,它是图形硬件设备所执行的一类特殊函数。 理解着色器最好的方法是把它看做专为图形处理单元(通常也叫做 GPU)编译的一种小型程序。
在 OpenGL 中,会用到四种不同的着色阶段(shader stage)。其中最常用的包括 的顶点着色器(vertex shader)以及片元着色器,前 者用于处理顶点数据,后者用于处理光栅化后的片元数据。
像素(pixel)是显示器上最小的可见单元。计 算机系统将所有的像素保存到帧缓存(framebuffer) 当中,后者是由图形硬件设备管理的一块独立内存 区域,可以直接映射到最终的显示设备上。
OpenGL语法
OpenGL 库 中 所 有 的 函 数 都 会 以 字 符“ gl ” 作 为 前 缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数。OpenGL 库中定义的常量也是 GL_COLOR_BUFFER_BIT 的形 式,如 display() 函数中所示。所有的常量都以 GL_ 作为前缀,并且使用下划线来分隔单词。为了能够方便地在不同的操作系统之间移植 OpenGL 程序,OpenGL 还为函数定义了 不同的数据类型,例如 GLfloat 是浮点数类型。
OpenGL 渲染管线
着色器是专门为gpu编译的小型应用程序,而渲染管线指的是数据处理过程,可以看做一个流水线,首先接受顶点数据,然后由顶点着色器处理,生成图元,再经过细分着色器,几何着色器,进行图元设置,裁剪,光栅化处理(输入的数据转换成屏幕位置对应的像素点)生成片元数据,送给片元着色器处理。
- 准备向 OpenGL 传输数据
OpenGL需要把数据保存到缓存对象中,它相当于OpenGL管理的一块内存区域。 - 将数据传输到 OpenGL
OpenGL数据初始化完成,需要调用一个绘制命令来请求渲染几何图元。glDrawArrays() 就是一个常用的绘制命令。 - 顶点着色
对于每一个顶点,都会有一个顶点着色器来专门处理此顶点相关的数据。可能进行一些复杂的操作(矩阵变换等)来得到顶点在屏幕上的位置。 - 细分着色
使用patch描绘物体的形状,生成最终的形状。
-几何着色
进一步细化。 - 图元装配
前面介绍的着色阶段所处理的都是顶点数据,此外这些顶点之间如何构成几何图元的所有信息也会被传递到OpenGL中,图元装配阶段将这些顶点以及相关的几何图元组织起来。 - 剪切
视口是我们可以进行绘制的窗口区域,有的顶点落在视口之外,与之相关的图元会做出改动,保证相关的像素不在窗口之外绘制。 - 光栅化
更新后的图元转化成片元,片元可以视为一个”候补的像素“,也就是可以放在帧缓冲中的像素。 - 片元着色
通过编程来控制屏幕上显示颜色的阶段。
我们可以用这种方法来理解顶点着色器和片元着色器的区别:顶点着色(包括细分和几何着色)决定了一个图元应该在屏幕的什么位置,而片元着色使用这些信息来决定某个片元的颜色应该是什么颜色。
- 逐片化的操作
使用深度测试和模板测试来决定一个片元是否可见。