• 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

  • 相关阅读:
    asp.net 重定向的三种方法
    C# 日期格式转【转】
    PL/SQL %TYPE和%ROWTYPE的区别【转】
    oracle 常用函数【转】
    阿里---arthas---代码诊断工具使用
    线上应用CPU占用过高
    Centos 7搭建Gitlab服务器超详细Centos 7搭建Gitlab服务器超详细(搭建成功)
    G1和CMS垃圾回收数据对比
    定位CPU暂用过高问题排查
    OAutho2----实现单点登录
  • 原文地址:https://www.cnblogs.com/nafio/p/9137326.html
Copyright © 2020-2023  润新知