http://blog.csdn.net/bugrunner/article/details/5455324

Geometry Shader可以处理Vertex Shader和Fragment Shader不能完成的一些操作。不含GS的可编程管线的传统处理流程是:

1.       顶点数据准备

2.       Vertex Shader操作

3.       完成Vertex Shader

4.       光栅化操作

5.       Fragment Shader

6.       完成Fragment Shader

这些过程是按顺序进行的,因此,只能吸收和输出一个顶点的Vertex Shader是不能创建或破坏原有几何形体的,而在加入了GS之后,GS就可以对每个顶点附近的数据进行访问,然后使用这些数据或生成新的几何形体,或者破坏原有的几何形体,进而进行一些自由度更高的操作。

GS在OpenGL中的位置如下:

GS在使用之前要先设置它的相关属性,主要有:接收的数据类型,输出的数据类型,输出的顶点的数量。

glProgramParameteriEXT(progname, GL_GEOMETRY_INPUT_TYPE, int value);

此处可选的value: Point, Line, Line with Adjacency, Triangle, Triangle with Adjacency

对于这些输入,在调用glBegin作绘制时应使格式一致,否则在GS中就得不到数据源

GL_LINES_ADJACENCY_EXT

GL_LINE_STRIP_ADJACENCY_EXT

GL_TRIANGLES_ADJACENCY_EXT

GL_TRIANGLE_STRIP_ADJACENCY_EXT

glProgramParameteriEXT(progname, GL_GEOMETRY_OUTPUT_TYPE_EXT, int value)

此处可选的value: Points, Lines, Line Strips, Triangle, Triangle Strips

glProgramParameteriEXT(progname, GL_GEOMETRY_VERTICES_OUT_EXT, int value);

此处的VALUE不能超过GS可输出的最大顶点数,否则设置无效。可以调用glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, GLuint* value)来得到硬件所支持的最大输出顶点数目。不只是在输出顶点时,而在输出线段,三角形时,可以输出的最大几何体元的数目均要受到此值的限制。

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[];

Varying out vec4 float gl_FogFragCoord;

内置输入:

Varying in vec4 gl_FrontColorIn[gl_VerticesIn];

Varying in vec4 gl_BackColorIn[gl_VerticesIn];

Varying in vec4 gl_FrontSecondaryColorIn[gl_VerticesIn];

Varying in vec4 gl_BackSecondaryColorIn[gl_VerticesIn];

Varying in vec4 gl_TexCoordIn[gl_VerticesIn][];

Varying in float gl_FogFragCoordIn[gl_VerticesIn];

Varying in vec4 gl_PositionIn[gl_VerticesIn];

Varying in float gl_PointSizeIn[gl_VerticesIn];

Varying in vec4 gl_ClipVertexIn[gl_VerticesIn];

内置函数:

Void EmitVertex();

Void EndPrimitive();

这两个函数的主要作用即是用来生成几何体元,其效果与调用glBegin(), glEnd()类似,只是不需要在生成开始处声明,只需在生成完成时调用EndPrimitive即可。

以下为基于GS的三角面细分效果图:

总结:

在可编程管线里加入了GS之后确实可以实现一些使用VS和FS做不到的事情,不过最大的问题就是效率,虽然数据由CPU向GPU的传输上会减少,但或许由于GPU指令太多,或其它什么原因导致GS整体效率不高,或许这也是DX11加入Teseellator是原因。

更加丰富的GS内容:

http://appsrv.cse.cuhk.edu.hk/~ymxie/Geometry_Shader

http://download.csdn.net/source/2204920

OpenGL Geometry Shader的更多相关文章

  1. CSharpGL(14)用geometry shader渲染模型的法线(normal)

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...

  2. Geometry shader总结

    什么是Geometry Shader GS存在于vertext shader和固定功能vertex post-processing stage之间,它是可选的不是必要的.GS的输入是单个primiti ...

  3. GLSL-几何着色器详解跟实例(GS:Geometry Shader)[转]

    [OpenGL4.0]GLSL-几何着色器详解和实例(GS:Geometry Shader) 一.什么是几何着色器(GS:Geometry Shader) Input Assembler(IA)从顶点 ...

  4. Geometry Shader 【转】

    Geometry shader – receives as its input complete primitives as a collection of vertices, and these i ...

  5. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...

  6. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...

  7. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...

  8. OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V

    学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...

  9. OpenGL - Tessellation Shader 【转】

    http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...

随机推荐

  1. Lua_第17 章 数学库

    第17 章 数学库 在这一章中(以下关于标准库的几章中相同)我的主要目的不是对每个函数给出完整地说明,而是告诉你标准库可以提供什么功能.为了可以清楚地说明问题,我可能 会忽略一些小的选项或者行为.基本 ...

  2. 从架构层面杜绝lua中使用未定义的变量

    # 从架构层面杜绝lua中使用未定义的变量 标签(空格分隔): lua --- lua中有一个很坑的地方:1.就是如果一个变量拼写错误,会自动的认为你定义了一个值为nil的全局变量.2.如果在func ...

  3. EasyDarwin开源流媒体音视频云平台遇到的奇葩问题:内网运行正常,公网流媒体不通

    最近在帮助EasyDarwin的用户部署EasyNVR+EasyDarwin云平台+EasyClient方案的过程中,遇到一个问题,EasyNVR分布在用户各地区现场的内网中,EasyDarwin云平 ...

  4. mysql 5.6 bug

    https://dev.mysql.com/doc/refman/5.6/en/account-management-sql.html USE mysql; SELECT Host,User FROM ...

  5. finding friends with mapreduce

    http://stevekrenzel.com/finding-friends-with-mapreduce

  6. NOIP考前感悟

    闭关这么久,后来突然后悔自己前几天和暑假的状态很頽 不然进步也还能多一点吧 还好提前发现了,最后也还是努力了一把 也算不枉费自己的选择吧 从初中开始学习OI,到头来也没有什么成果 但还好自己高一 也还 ...

  7. 分享一个utils.js源码

    NEJ.define([ './global.js', '{platform}util.js' ],function(NEJ,_h,_p,_o,_f,_r){ /* * 查看数据是否指定类型 * @p ...

  8. SDUT OJ 之 1571 《人品,有没有?》 字符串的处理问题

    人品,有木有? Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 新一届的山东理工大学ACM网络擂台赛就要开始啦!听说晋级的选手有机 ...

  9. java版的下雪,大家圣诞快乐

    1. [代码][Java]代码    package com.yk.tools.game; import java.applet.AudioClip;import java.awt.Dimension ...

  10. java编程思想-基础

    interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不 ...