OpenGL Geometry Shader
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的更多相关文章
- CSharpGL(14)用geometry shader渲染模型的法线(normal)
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...
- Geometry shader总结
什么是Geometry Shader GS存在于vertext shader和固定功能vertex post-processing stage之间,它是可选的不是必要的.GS的输入是单个primiti ...
- GLSL-几何着色器详解跟实例(GS:Geometry Shader)[转]
[OpenGL4.0]GLSL-几何着色器详解和实例(GS:Geometry Shader) 一.什么是几何着色器(GS:Geometry Shader) Input Assembler(IA)从顶点 ...
- Geometry Shader 【转】
Geometry shader – receives as its input complete primitives as a collection of vertices, and these i ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...
- OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V
学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...
- OpenGL - Tessellation Shader 【转】
http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...
随机推荐
- 手机QQ后台清理不掉的秘密——anddroid悬浮窗
问题来自于一篇文章:手机QQ后台为何清不掉?MIUIproject师:全靠1像素的页面保命 出于好奇,想知道这一像素究竟是啥东西,用手机安全管家控制QQ的悬浮窗权限: 关闭QQ的悬浮窗权限,通过后台一 ...
- linux 中添加自己的库路径的方法 cannot open shared object file: No such file or directory
本文转自:http://blog.csdn.net/maotianwang/article/details/44619197 库文档在连接(静态库和共享库)和运行(仅限于使用共享库的程式)时被使用,其 ...
- 解析json的方式
一.Javascrip操作json 原始方式: var str1 = '{ "name": "jacun", "addr": "b ...
- angularjs ng-repeat倒叙
<div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng ...
- JavaSE基础练习IO,字符串,循环
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- ReentrantReadWriteLock读写锁实现分析
排他锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他的写线程均被阻塞.读写锁内部维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使 ...
- html5--3.18 新增的output元素
html5--3.18 新增的output元素 学习要点 了解output元素的用法 output元素:数据的输出 output元素是HTML5新增的元素,用来设置不同数据的输出 output元素的输 ...
- SQL server 备份/恢复/压缩 进度查询
第一步,用 sp_who2 查出备份的sid(或在窗口中的连接属性中看) exec sp_who2 第二步,用以下查询获得运行情况(看 percent_complete列) SELECT sessio ...
- git bash的使用
一.创建本地版本控制仓库 cd e: 进入e盘 cd gitspace 进入gitspace文件夹 git init 将E:\gitspace初始化为本地版本控制仓库 Initialized em ...
- 基于aspectj实现AOP操作的两种方式——xml配置
1. 要导入的 jar 包: 常用的aspectj表达式: 权限修饰符可以省略,以下表示:返回值类型为任意,com.chy.service包以及其子包下的.任意类的.参数任意的.任意方法 execut ...