OpenGL 管线
1.管线
可编程管线:
顶点着色器--裁剪--光栅化--片段着色器--抗锯齿--基于片段的操作(像素拥有权,裁剪测试,alpha测试,模板测试,混 合,抖动,逻辑操作,和帧缓冲区写入)
2.对各个阶段的详细说明
(1). 指定几何对象.(也就是顶点数据来源)
如:点 线三角形.等一些几何图元..OpenGL绘制几何图元的方法有以下三种:
<1> 一次一个顶点.即使用glBegin() glVertex() glEnd() 指定几何对象.
<2> 使用顶点数组..如glDrawArrays.glDrawElements.等.一次性的绘制大量图元.
上面这两种模式则是立即模式.即指定完图元之后会被立即渲染.即将所有数据发往渲染管线后立即被渲染.
<3>显示列表模式.它存储于OpenGL服务端 (接收OpenGL命令的一端.) glNewList glEndList glCallList
(2). 顶点着色器
顶点着色器产生这个顶点的纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。
在这个阶段能做的工作则是:
1. 顶点变换...根据模型视图和投影矩阵变换
2. 光照计算
(1).对法线的计算: 法线变换(法线矩阵 是模型矩阵的左上角3*3的逆矩阵)和法线规格化
(2).对这个顶点进行光照计算,计算后的值包括主要颜色和次要颜色,如gl_FrontColor,gl_FrontSecondDaryColor等,见<GLSL quicker ref>
3. 纹理坐标变换.(纹理矩阵)
4.材质状态 纹理坐标生成,既是计算这个顶点对应的纹理坐标
而最重要的则是变换以及光照. 每个顶点在这个阶段分别是单独处理的.
这个阶段所接收到的数据则是每个顶点的属性特征..输出则是变换后的顶点数据.
顶点着色器编程补充说明:
1)必须输出 gl_position 这个值。具体可以参加 《shader 例子 ---> 最简单的shader》
(3). 图元组装(几何着色器)
在顶点处理之后,顶点的全部属性都已经被确定 在这个阶段顶点将会根据应用程序送往的图元规则.
GL_POINTS GL_TRIANGLES 等 将会被组装成图元
(4). 图元处理(裁剪 消隐)
<1>这个步骤第一个所做的应当是裁剪操作..会将图元与用户定义的裁剪平面即glClipPlane 和模型投影矩阵所建立的视景比较. 这将会裁剪且丢弃位于视景和裁剪平面外部的图元.不在予以处理.
<2> 其次.若是采用透视投影那么.将会对每个顶点的x,y z坐标分别除以w.
<3>紧接着 则是由视口变换将顶点坐标变换至窗口坐标.
<4> 执行消隐操作
(5). 栅格化操作
<1>由图元处理传递过来的图元数据.在此将会被分解成更小的单元并对应帧缓冲区的各个像素.这些单元被称之为片元. 一个片元可能包含窗口左边 深度 颜色 纹理坐标等属性.
<2> 片元的属性则是图元上顶点数据等经过插值而确定的..这里生成的片元将会包含主颜色和次颜色.
glShadeMode() 函数的作用将会这里体现.即使用插值(平滑着色) 或者使用最后一个顶点颜色(平面着色)
特别要注意的是:varying 变量也会在光栅化的时候被插值。
<3> 点宽线宽.多边形模式,正面背面等一些特征也将是这阶段发生作用.
<4> 反走样也是这个阶段起作用.
(6). 片元处理(fragment Shader)
片断着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
光栅化器已经将多边形填满并通过流水线传送至片断着色器,由片断着色器来决定这个片断的颜色。对片断着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定这个像素最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
<1>上纹理通过纹理坐标取得纹理内存中相对应的颜色
<2> 雾化 通过片元距离当前视点位置修改颜色.
<3> 颜色汇总..(这个与混合完全不同概念.将(纹理,主定义的颜色,雾化的颜色,次颜色光照阶段计算的颜色)汇总一起.
片断处理器补充说明:
1)片断处理器中可以使用关键字 discard
discard --只可用于片元着色器,当控制流遇到这个关键字时,正在处理的片元就会被标记为将要丢弃
(7). 帧缓冲操作
<1>这个阶段执行帧缓冲的写入等操作等..最后产生了显示出来的像素.
glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 等.将在这个阶段影响写入的值.
以上只是讨论OpenGL 图元绘制的基本过程 那么基于像素图像绘制.几乎形同之上..只是在光栅化处理前的操作不一样.即经过像素解码像素传输.栅格化 最后形成片元...片元之后的处理完全一样..
3.因此 在着色器编程领域..你将可实现
Vertex Shader 替换 顶点处理阶段
Fragment Shader 替换 片元处理阶段
Geometry Shader 替换 图元组装阶段..
因为这三个阶段所决定都是最重要效果的阶段..对于这些的可编程将带来非常大的好处以及可控制的渲染!!
1.管线
可编程管线:
顶点着色器--裁剪--光栅化--片段着色器--抗锯齿--基于片段的操作(像素拥有权,裁剪测试,alpha测试,模板测试,混 合,抖动,逻辑操作,和帧缓冲区写入)
2.对各个阶段的详细说明
(1). 指定几何对象.(也就是顶点数据来源)
如:点 线三角形.等一些几何图元..OpenGL绘制几何图元的方法有以下三种:
<1> 一次一个顶点.即使用glBegin() glVertex() glEnd() 指定几何对象.
<2> 使用顶点数组..如glDrawArrays.glDrawElements.等.一次性的绘制大量图元.
上面这两种模式则是立即模式.即指定完图元之后会被立即渲染.即将所有数据发往渲染管线后立即被渲染.
<3>显示列表模式.它存储于OpenGL服务端 (接收OpenGL命令的一端.) glNewList glEndList glCallList
(2). 顶点着色器
顶点着色器产生这个顶点的纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。
在这个阶段能做的工作则是:
1. 顶点变换...根据模型视图和投影矩阵变换
2. 光照计算
(1).对法线的计算: 法线变换(法线矩阵 是模型矩阵的左上角3*3的逆矩阵)和法线规格化
(2).对这个顶点进行光照计算,计算后的值包括主要颜色和次要颜色,如gl_FrontColor,gl_FrontSecondDaryColor等,见<GLSL quicker ref>
3. 纹理坐标变换.(纹理矩阵)
4.材质状态 纹理坐标生成,既是计算这个顶点对应的纹理坐标
而最重要的则是变换以及光照. 每个顶点在这个阶段分别是单独处理的.
这个阶段所接收到的数据则是每个顶点的属性特征..输出则是变换后的顶点数据.
顶点着色器编程补充说明:
1)必须输出 gl_position 这个值。具体可以参加 《shader 例子 ---> 最简单的shader》
(3). 图元组装(几何着色器)
在顶点处理之后,顶点的全部属性都已经被确定 在这个阶段顶点将会根据应用程序送往的图元规则.
GL_POINTS GL_TRIANGLES 等 将会被组装成图元
(4). 图元处理(裁剪 消隐)
<1>这个步骤第一个所做的应当是裁剪操作..会将图元与用户定义的裁剪平面即glClipPlane 和模型投影矩阵所建立的视景比较. 这将会裁剪且丢弃位于视景和裁剪平面外部的图元.不在予以处理.
<2> 其次.若是采用透视投影那么.将会对每个顶点的x,y z坐标分别除以w.
<3>紧接着 则是由视口变换将顶点坐标变换至窗口坐标.
<4> 执行消隐操作
(5). 栅格化操作
<1>由图元处理传递过来的图元数据.在此将会被分解成更小的单元并对应帧缓冲区的各个像素.这些单元被称之为片元. 一个片元可能包含窗口左边 深度 颜色 纹理坐标等属性.
<2> 片元的属性则是图元上顶点数据等经过插值而确定的..这里生成的片元将会包含主颜色和次颜色.
glShadeMode() 函数的作用将会这里体现.即使用插值(平滑着色) 或者使用最后一个顶点颜色(平面着色)
特别要注意的是:varying 变量也会在光栅化的时候被插值。
<3> 点宽线宽.多边形模式,正面背面等一些特征也将是这阶段发生作用.
<4> 反走样也是这个阶段起作用.
(6). 片元处理(fragment Shader)
片断着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
光栅化器已经将多边形填满并通过流水线传送至片断着色器,由片断着色器来决定这个片断的颜色。对片断着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定这个像素最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
<1>上纹理通过纹理坐标取得纹理内存中相对应的颜色
<2> 雾化 通过片元距离当前视点位置修改颜色.
<3> 颜色汇总..(这个与混合完全不同概念.将(纹理,主定义的颜色,雾化的颜色,次颜色光照阶段计算的颜色)汇总一起.
片断处理器补充说明:
1)片断处理器中可以使用关键字 discard
discard --只可用于片元着色器,当控制流遇到这个关键字时,正在处理的片元就会被标记为将要丢弃
(7). 帧缓冲操作
<1>这个阶段执行帧缓冲的写入等操作等..最后产生了显示出来的像素.
glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 等.将在这个阶段影响写入的值.
以上只是讨论OpenGL 图元绘制的基本过程 那么基于像素图像绘制.几乎形同之上..只是在光栅化处理前的操作不一样.即经过像素解码像素传输.栅格化 最后形成片元...片元之后的处理完全一样..
3.因此 在着色器编程领域..你将可实现
Vertex Shader 替换 顶点处理阶段
Fragment Shader 替换 片元处理阶段
Geometry Shader 替换 图元组装阶段..
因为这三个阶段所决定都是最重要效果的阶段..对于这些的可编程将带来非常大的好处以及可控制的渲染!!