GLSL-几何着色器详解跟实例(GS:Geometry Shader)

【OpenGL4.0】GLSL-几何着色器详解和实例(GS:Geometry Shader)

一、什么是几何着色器(GS:Geometry Shader)


Input Assembler(IA)从顶点缓冲区上的输入流中接收顶点数据,并且把数据项转换为规范的格式。vertex shader通常用来把顶点从模型空间变换到平面空间,vertex shader读取一个顶点,输出一个顶点。Pixel Shader读取单一pixel属性,输出包含颜色和Z信息的的片断。而geometry shader是DirectX10提出的,把同一区域的所有顶点作为输入,产生新的顶点或者区域。此外数据流输出(steam output)把geometry shader输出的顶点信息复制为4个连续的输出缓冲子集。理论上来说,steam output的输出能力和Input Assembler的输入能力相匹配。
Shader就是一段可以改变像素、顶点和几何学特征的小程序。Vertex Shader是专门处理多边形顶点的。那么Geometry shader就是专门用来处理场景中的几何图形。在过去Vertex Shader每一次运行只能处理一个顶点的数据,并且每次只能输出一个顶点的结果。在整个游戏场景中,绘制的几何图形的任务量非常庞大,如果仅仅依靠 Vertex Shader单一来完成,效率会极其低下。

现在DX10的设计师们在顶点与像素的处理过程中又加入了(Geometry shader)几何着色器。它可以根据顶点的信息来批量处理几何图形,对Vertex附近的数据进行函数处理,快速创造出新的多边形。通过stream out将这些结果传递给其他Shader或buffer,将CPU从复杂庞大的几何运算中解放出来。大爆炸,粒子效果,瀑布流水等复杂又关联的场景都可以 用Geometry shader很逼真的表现出来。

图一是渲染管线示意图。


图一 渲染管线示意图

GS位于VS与PS之间,可以完成许多模型层面上的工作诸如LOD。以往这些工作都是在CPU上完成的,占用了宝贵的CPU循环 —— CPU可是很繁忙的东西,游戏逻辑、音乐、输入接受都是靠它,却无法提高多少性能,CPU的并行计算性能是远远无法和GPU相比的。



二、几何着色器功能简介

GS被设计针对每个图元执行一次。它能够访问图元的所有顶点,以及与其相关的输入变量的值。换句话说,如果前一阶段提供了某一个输出变量,那么GS就可以访问图元中所有顶点的那个变量的值。因此,GS中的输入变量都是数组类型。


需要注意的是,GS所接受的图元和以前的不同,它只接受“可调整的”图元。


可调整的图元(Adjacency Primitive)

在OpenGL中,我们定义了新的图元类型:

GL_LINES_ADJACENCY_EXT 
GL_LINE_STRIP_ADJACENCY_EXT 
GL_TRIANGLES_ADJACENCY_EXT 
GL_TRIANGLE_STRIP_ADJECENCY_EXT

我们可以在glBegin()、glDrawElements()中将他们作为新的参数使用。下面分别说明这4中类型的特点。

(1)Lines with Adjacecy


4*N个顶点被提供,N是要绘制的线段的数目。线段在#1个#2之间绘制,#0和#3提供调整信息。

(2)Line Strip with Adjacency


顶点数目是N+3,N是要绘制的线段的数目。线段在#1、#2、。。。、#N+1之间绘制,#0和#N+2提供调整信息。

(3)Triangles with Adjacency


顶点数目是6*N,组成三角形的是#0、#2、#4.而#1、#3、#5定义了修正三角形。

(4)Triangle Strip with Adjacency

你可能感兴趣的:(try)