守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1692|回复: 0
打印 上一主题 下一主题

[技术资料] OpenGL Geometry Shader

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52903
    钢镚
    1422

    开源英雄守望者

    跳转到指定楼层
    楼主
    发表于 2014-12-31 20:28:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    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在使用之前要先设置它的相关属性,主要有:接收的数据类型,输出的数据类型,输出的顶点的数量。

    1. glProgramParameteriEXT(progname, GL_GEOMETRY_INPUT_TYPE, int value);
    复制代码

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

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

    1. GL_LINES_ADJACENCY_EXT
    2. GL_LINE_STRIP_ADJACENCY_EXT
    3. GL_TRIANGLES_ADJACENCY_EXT
    4. GL_TRIANGLE_STRIP_ADJACENCY_EXT
    复制代码
    1. glProgramParameteriEXT(progname, GL_GEOMETRY_OUTPUT_TYPE_EXT, int value)
    复制代码

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

    1. glProgramParameteriEXT(progname, GL_GEOMETRY_VERTICES_OUT_EXT, int value);
    复制代码

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

    GS中可以使用的内置输入和输出变量主要有:


    内置输出:

    1. Varying out vec4 gl_FrontColor
    2. Varying out vec4 gl_BackColor
    3. Varying out vec4 gl_FrontSecondaryColor;
    4. Varying out vec4 gl_BackSecondaryColor
    5. Varying out vec4 gl_TexCoord[];
    6. Varying out vec4 float gl_FogFragCoord;
    复制代码

    内置输入:

    1. Varying in vec4 gl_FrontColorIn[gl_VerticesIn];
    2. Varying in vec4 gl_BackColorIn[gl_VerticesIn];
    3. Varying in vec4 gl_FrontSecondaryColorIn[gl_VerticesIn];
    4. Varying in vec4 gl_BackSecondaryColorIn[gl_VerticesIn];
    5. Varying in vec4 gl_TexCoordIn[gl_VerticesIn][];
    6. Varying in float gl_FogFragCoordIn[gl_VerticesIn];
    7. Varying in vec4 gl_PositionIn[gl_VerticesIn];
    8. Varying in float gl_PointSizeIn[gl_VerticesIn];
    9. Varying in vec4 gl_ClipVertexIn[gl_VerticesIn];
    复制代码

    内置函数:

    1. Void EmitVertex();
    2. 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


    本文来自:http://blog.csdn.net/bugrunner/article/details/5455324


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏 分享分享 支持支持 反对反对 微信
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2026-1-24 03:44 , Processed in 0.053771 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表