好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

几何着色器例子.doc

11页
  • 卖家[上传人]:gg****m
  • 文档编号:206188464
  • 上传时间:2021-10-30
  • 文档格式:DOC
  • 文档大小:389KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • ―、什么是几何着色器(GS: Geometry Shader)Input Assembler (TA)从顶点缓冲区上的输入流中接收顶点数据,并旦把数据项转换为规范 的格式o vertex shader通常用来把顶点从模型空间变换到平面空间,vertex shader读取一 个顶点,输出一个顶点Pixel Shader读取单一 pixel属性,输出包含颜色和Z信息的的片 断而geometry shader是DirectXl0提出的,把同一区域的所有顶点作为输入,产生新的 顶点或者区域此外数据流输出(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相比的Vertex ShaderPrimitive AssemblyGeometry Shader i 二二二:「二二二一二Fixed Function Vertex ProcessingTransformed positionPrimitive AssemblyColor ClampingFlat ShadingClippingHomogeneous DivideViewport TransformFacing DeterminationRasterizationFragment Shader.巧 Fixed FunctionFragment Processing二、几何着色器功能简介GS被设计针对每个图元执行一次。

      它能够访问图元的所有顶点,以及与其相关的输入变量的 值换句话说,如果前一阶段提供了某一个输出变量,那么GS就可以访问图元中所有顶点的 那个变量的值因此,GS中的输入变量都是数组类型 Geometry Shader:What Does it Do?Application generates thesePoints, Lines, Line Strip, Line Loop,,Lines withAdjacency, Line Strip with Adjacency, Triangles,Triangle Strip, Triangle Fan, Triangles withAdjacency, Triangle Strip with AdjacencyDriver feeds these one-at-a-time into the Geometry Shaderf. J Point, Line, Line with Adjacency, J Triangle, Triangle with AdjacencyPoints, LineStrips, TriangleStripsGeometry ShaderGeometry Shader generates (almost) many of these as it wantsThere neednt be any correlation between Geometry Shader input type and Geometry Shader output type. Points can generate triangles, triangles can generate triangle strips, etc.需要注意的是,GS所接受的图元和以前的不同,它只接受“如调整的”图元。

      可调整的图元(Adjacency Primitive)在OpenGL中,我们定义了新的图元类型:GL_LINES_ADJACENCY_EXTGL_LINE_STRIP_ADJACENCY_EXTGL_TRIANGLES_ADJACENCY_EXTGL_TRIANGLE_STRIP_ADJECENCY_EXT我们可以在glBeginO、glDrawElements () +将他们作为新的参数使用下面分别说明这4 中类型的特点1) Lines with Adjacecy0 12 3O O_o oN= 14*1\1个顶点被提供,N是要绘制的线段的数目线段在#1个#2之间绘制,#0和#3提供调整信息2) Line Strip with Adjacency0 1 2 3 4 5O O~O~O~O ON= 3顶点数目是N+3, N是要绘制的线段的数目线段在#1、#2、N+1之间绘制,#0和#*2提供 调整信息3) Triangles with Adjacency顶点数目是6*N,组成三角形的是#0、#2、#4.而#1、#3、#5定义了修正三角形4) Triangle Strip with Adjacency顶点数目是2N+4.#0、#2、。

      定义三角形序列其他的定义调整三角形在看色器链接之前,必须调用gIProgramParameter 行相应的设置1) 设置GS可以输出的最大顶点数目glProgramParameteriEXT( progname, GL_GEOMETRY_VERTICES_OUT_EXT, int value )(2) 设置GS接收的图元的类型glProgramParameteriEXT( progname, GL_GEOMETRY_INPUT_TYPE_EXT, int value )需要注意的是,GS的输出图元的类型必须和输入图元的类型匹配value的可能取值是:A、 GL_POINTSB、 GL_LINES对应的输入图元类型可以是:GLJJNES、GL_LINE_STRIP、GL_LINE_LOOPC、 GL_LINES_ADJACENCY_EXT对应的输入图元类型可以是:GL_LINES_ADJACENCY_EXT、GL_LINES_STRIP_ADJACENCY_EXTD、 GL_TRIANGLES对应的输入图元类型可以是:GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FANE、 GL_TRIANGLE_ADJACENCY_EXT对应的输入图元类型可以是:GL_TRIANGLES_ADJACENCY_EXT>GL_TRIANGLE_STRIP_ADJACENCY_EXT(3) 设置输出图元类型glProgramParameteriEXT( progname, GL_GEOMETRY_OUTPUT_TYPE_EXT, int value )value的可能取值是:GL_POINTSGL_LINE_STRIPGL_TRIANGLE_STRIP GS可以输出0个、1个或者多个图元。

      这些图元的类型和它从前一阶段接收到的图元的类型 不一定相同然而,GS不能输出多种类型的图元比如,GS可以接收三角形,输出多个线段 序列,或者是输出0个或多个三角形序列这就是的GS有多种用途下面是几个典型例子一个GS可以依据某些准则比如可见性来移 除一些图元GS也可以产生额外的图元扩大所渲染的对象的形状GS也可以计算图元的额外 信息,而把图元原封不动的输出GS也可以输出和输入图元完全不同的图元and will Write ThemIf a Vertex Shader then the Geometry Shader to the FragmentWrites Variables as:will Read Them as:Shader as:gl_Positiongl_Positionln 目• gl_Positiongl_TexCoord[] gl_FrontColor gl_BackColor gl_PointSize gl_Layer> gl_TexCoordln[cj []* gl_TexCoord[]“varying”gl_FrontColorln[cj• gl_FrontColor> gl_BackColorln目♦ gl_PointSizeln 目> gl_BackColor♦ gLPointSize> gl_Layerln目♦ gl_Layer“varying in”"varying out”在GS中,绿色正方形所表示的是III变量gl_Verticesln所指定的,即最大维数。

      GS内置输出变量:varying out vec4 gl_FrontColor;varying out vec4 gl_BackColor;varying out vec4 gl_FrontSecondaryColor;varying out vec4 gl_BackSecondaryColor;varying out vec4 gl_TexCoord[]; // at most gl_MaxTextureCoords varying out float gl_FogFragCoord;GS内置输入变量:varying in vec4 gl_FrontColorln[gl_Verticesln];varying in vec4 gl_BackColorln[gl_Verticesln];varying in vec4 gl_FrontSecondaryColorln[gl_Verticesln];varying in vec4 gl_BackSecondaryColorln[gl_Verticesln];varying in vec4 gl_TexCoordln[gl_Verticesln][]; // at most will be// gl_MaxTextureCoordsvarying in float gl_FogFragCoordln[gl_Verticesln];varying in vec4 gl_Positionln[gl_Verticesln];varying in float gl_PointSizeln[gl_Verticesln];varying in vec4 gl_ClipVertexln[gl_Verticesln];GS的功能实现基于两。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.