OpenGL 学习日志 002

OpenGL 学习日志 002

基础图形管线

客户机-服务器

客户端是存储在CPU寄存器中的,并且在应用程序中执行,或者在主系统内存的驱动程序中执行,驱动程序将渲染命令与数据结合起来!
,并发送到服务器上来执行,在一台典型的桌面计算机上,服务器会跨越一些系统总线,实际上,他就是图形加速卡上的硬件和内存 ,服务器和客户机在功能上是异步的,他们有各自独立的硬件和软件,为了获得更佳的性能,我们希望他们两个都尽可能的工作,客户机不断的将数据块和命令组合在一起并送入缓冲区,然后缓冲区会将这些数据发送到服务器执行,服务器执行缓冲区的内容,于此同时,客户机又发送了一次数据,如果服务器停止工作等待客户机,或者客户机停止工作来等待服务器接受更多命令和数据准备,我们就把这种情况称之为管线停滞,管线停滞是注重性能的程序猿的噩梦,我们真的不希望CPU和GPU闲置

---- 此段内容摘抄原文

着色器
16070682275515.jpg

可以看出图形管线包含很多部分:先接受一组3D坐标,然后经过图元装配 -- 几何着色器 -- 光栅化 -- 片段着色器 -- 最后测试混合才转变为你屏幕上的有色2D像素输出。图形渲染管线的每个阶段将会把前一个阶段的输出作为这个阶段的输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。
注意上图中的蓝色阶段代表我们可以注入自定义的着色器,这就允许我们用自己写的着色器来替换默认的。这样我们就可以更细致地控制图形渲染管线中的特定部分了,而且因为它们运行在GPU上,所以它们可以给我们节约宝贵的CPU时间。

图形管线非常复杂,它包含很多可配置的部分。然而,对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了。

投影

正投影

我们通常在2D的绘制中使用正投影,可理解为一个物体的正视图,我们始终看到一个物体的一个面(或者多个面组成的一个面,假如一个圆锥,我们从上往下看,他就是一个圆形)

透视投影

远小近大 是我对透视投影最直观的理解,书上介绍了一个金字塔截断的图。

16070687891701.jpg

在OepnGL中,可通过GLFrustun 类通过调用 SetPersPective 方法为我们构建一个平截头体

点和线

图元 描述
GL_POINTS 每个顶点在屏幕上都是一个单独的点
GL_LINES 每2个点定义了一个线段
GL_LINE_STRIP 从第一个顶点依次经过每个后续的顶点绘制的线条
GL_LINE_LOOP 与上个唯一的不同是,最后一个顶点也和第一个顶点连接起来
GL_TRIANGLE 每三个点定义了一个新的三角形
GL_TRIANGLE_STRIP 公用一个带(strip)上的顶点的一组三角形
GL_TRIANGLE_FAN 以一个原点为中心呈扇形排列,公用相邻顶点的一组三角形

点是最简单的图元,每个特定的顶点在屏幕上都仅仅是一个单独的点。默认情况下一个点为一个像素,但是我们可通过glpointSize 来改变其默认大小。

void glpointSize(GlFloat size);

这个size 并不是所有大小都可以支持的,或者说是 有效参数,使用下面的函数可获取支持的小大范围

GLFloat sizes[2];//最小值和最大值
GLFloat step; //最小步长的保存值
glGetFloatv (GL_POINT_SIZE_RANGE,Sizes);
glGetFloatv (GL_POINT_SIZE_GRANUKARITY,&step);

点不会近大远小,不受透视视图的影响。

线

比点更进一步的是独立的线段。一条线段是在两个顶点之间绘制的,所以第一批线段应该摆阔偶数个顶点,每两个顶点都是线段的终点,默认情况下,线段的宽度为一个像素,改变线段的宽度的唯一方式是使用glLineWidth来设置

void glLineWidth(GLfloat width);
线带

线带(lineStrip)连续的从一个顶点到下一个顶点绘制线段,以形成一个真正连接点的线条,每个链接顶点都会被选定2次,其中一次是作为一条线段的终点,另一次则是作为下一条线段的起点,移动所有这些额外的数据并对同一个点进行两次转换,对于GPU的带宽和时钟来说都是一种浪费,在此显示同一组的点,这次是作为 GL_Line_STRIP 绘制的。

线环

线环(Line Loop)是线带的一种扩展,在线带的基础上增加了一条 从第一个点连接最后一个点的线。形成了一个闭环。

环绕

OpenGL 认为 具有逆时针方向环绕的多边形是正面的,如果想改变OpenGL 这个默认行为,可以使用下面的函数

glFrontFace(GL_CW);

GL_CW参数告诉OpenGL顺时针环绕的多边形将被认为是正面的。
GL_CCW这个参数告诉OpenGL你是真环绕的多边形为正面,

三角形带
16070745266464.jpg

使用三角形带而不是分贝指定每个三角形,这样做有两个优点,

  1. 用前3个顶点指定的第一个三角形后,对于接下里啊的每个三角形,只需要再制定一个顶点,绘制大量三角形的时候,采用这种做法可以节省大量的程序代码和数据存储空间。
  2. 提高运算性能节省带宽

三角形扇

还可以使用GL_TRIANGLE_FAN 创建一组围绕一个中心点的相连的三角形。


16070745493881.jpg

一个简单的批次容器

GLtloos 包含一个简单的容器类 **GBatch** 他知道使用GLshaderManager 支持的任意存储着色器时如果对图元进行渲染的。使用 **GBatch** 也非常简单。首先对批次进行初始化,告诉这个类代表那种图元,包括其中的顶点数。以及一组或者两组纹理坐标。

书本第73页 未完待续。

你可能感兴趣的:(OpenGL 学习日志 002)