GLSL Core Tutorial – Geometry Shader

原文:http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/geometry-shader/

 

  几何shader是OpenGL3.2之后的内容.这个阶段是可选的,当使用时,它接受在上一阶段组合的图元作为输入。一个几何shader不接受条带状,伞状或者环状的图元。几何shader接受组合后的图元,所以如何绘制命令指明是三角形带图元的话,几何shader实际上接受的是三角形。

    跟顶点shader比较,几何shader完全知道正在工作的图元。对于每一个输入图元,几何shader获取所以组成图元的顶点,如果指定的话,还包括邻接的信息。

几何shader可以接受的图元包括:

 

points (1)
lines (2)
lines_adjacency (4)
triangles (3)
triangles_adjacency (6)

括号里面的数字表示每种图元的顶点数量。

需要注意的是,几何shader的输入必须与在图元装配阶段描述图元匹配,那个阶段的图元由OpenGL绘制命令指出。当接受的图元带有邻接信息时(lines_adjacency 或者 triangles_adjacency)顶点的顺序如下所示:

 

输出图元类型有:

points
line_strip
triangle_strip

      输入输出之间的图元并不需要相互匹配。例如,几何shader接受三角形,输出则是点或者线条带。

一个几何shader可以输出0个或者更多的图元。例如,if outputting triangle strips, a geometry shader can output three strips, with two triangles each。在shader处理之后,输入图元通常被丢弃。

      这意味着,如果几何shader选择不为特定的输入图元生成任何输出图元的话,等效于一些剔除处理。同样,对于每一个图元,几何shader可以生成多个图元。然而要注意的是,几何shader不是被设计去生成大量几何图形的,例如,它不能够担任细分的目的。

     输入和输出图元的类型都需要在shader中使用layout说明符进行声明。假设输入图元类型是三角形,输出图元类型是线条,我们的shader代码可以像下面这样:

// geometry shaders require at least version 1.5
#version 150

layout (triangles) in;
layout (line_strip, max_vertices = 4) out;
...

        max_vertices限制着几何shadr输出的顶点数量,这是真的!如果我们尝试输出比说明更多的顶点,超过的顶点将不会送到 Pipeline的保留区。在OpenGL4.0, 对于每一个输入图元,一个几何shader能够被调用多次。在输入layout说明符中的invocations定义了调用次数的值。在下面的例子中,每一个图元几何shader要被调用两次。

#version 400

layout (triangles, invocations = 2) in;
layout (line_strip, max_vertices = 4) out;
...

     如果在layout中invocations是缺省的话,每一个图元shader会调用一次。

除了用户定义的那些作为顶点shader输出的顶点属性外,几何shader可以获取unifrom变量和纹理值。

下面是提供的内置变量:

in gl_PerVertex {
    vec4  gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[];

in int gl_PrimitiveIDIn;
// only for OpenGL 4.0+
in int gl_InvocationID;

      需要注意的是,几何shader输入的in结构体gl_PerVertex必须与顶点shader里面out结构体对应相等,但这一次是以数组的格式。gl_PrimitiveID变量存储着OpenGL的Draw命令生成的图元索引值。

      尽管在概念上几何shader生成图元,事实上它生成的是顶点。因此,如果输出图元是一个三角形的话,几何shader应该写入三个顶点的属性值。然后顶点根据输出layout的设置组合成图元。对于每个顶点有着下列的内置变量可以使用:

out gl_PerVertex {
    vec4  gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
};

out int gl_PrimitiveID;
out int gl_Layer;
// only for OpenGL 4.1+
out int gl_ViewportIndex;

        在顶点shader中,gl_Position是可选的,但是接下来的阶段可能依赖它来进行插值操作。对于每个provoking的顶点,gl_PrimitiveID至少应该被写入一次。至于gl_Layer和gl_ViewportIndex, 如果说明的话,一个图元的所有顶点必须被写入相同的值。没有说明的话,例如:如果几何shader没有写入gl_ViewportIndex或者gl_Layer, 那么他们的值将会是0.

        在绘制时,几何shader的每一个图元可以被指定一个layer。This allows the geometry shader to specify multiple primitives, and direct them to different layers. Layered rendering 说明帧缓存的使用方式,反之gl_Layer被忽略。层次rendering的一个使用例子是:一次传递,映射到一个立方体的六个面。

      在OpenGL4.1,几何shader可以选择输出ViewPort,使用这个特性多视图可以同时进行rendering。

除了内置变量,几何shader可以声明并写入用户定义的变量。正如前面的shader,使用变换的反馈,几何着色器的输出可以被重定向到一个缓冲器(或一组缓冲器。

时间: 2024-12-10 21:48:37

GLSL Core Tutorial – Geometry Shader的相关文章

GLSL Core Tutorial – Vertex Shader

译自:http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/vertex-shader/ 一个顶点shader作用于一些独立的点,每个顶点操作一次.shader并不清楚其它组成图形图元的那些顶点,也没有说明作用的顶点属于哪种类型图元.对于每一个输入顶点,shader输出单一顶点(简单说就是顶点shader是逐顶点操作,作用结果还是一些顶点) 每一个顶点都有着用户定义的一些输入属性,例如:位置,法线向量,纹理坐标.顶点shader同样可以

GLSL Core Tutorial – Tessellation

原文:http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/glsl-core-tutorial-tessellation/ 细分曲面是图形pipeline的一个阶段,这个阶段接受patches作为输入,产生可以是点,线和三角形的图元.patch是一组顶点,这些顶点属性在顶点shader被计算.细分shader接收一组变换后的顶点.例如patch,通常把它细分成更小的图元.跟其它的OpenGL图元类型相比,patches有着用户定义的顶

GLSL Core Tutorial – Primitive Assembly

原文:http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/primitive-assembly/   图元装配阶段把顶点shader处理后的数据作为输入,而这些顶点如何进行组合则是应用程序通过调用OpenGL函数glDraw*来指明的(图中橙色部分).       顶点的连接说明了顶点怎么组合成图元.图元可以是点,线,三角形或者patches.除此之外,可以提供毗邻的信息.例如,应用程序同样提供了生成邻接图元的顶点数据.这个数据只在几

GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2)

译自:http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/pipeline33/ 下图简单展示了OpenGL3.2版本之后绘制的pipeline.在后面的内容将介绍pipeline的每一部分.图中插入的数字(括号里面的)指明pipeline中一些阶段需要特定OpenGL版本. 例如(4.2)表示需要OpenGL4.2的版本.

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

[OpenGL4.0]GLSL-几何着色器详解和实例(GS:Geometry Shader) 一.什么是几何着色器(GS:Geometry Shader) Input Assembler(IA)从顶点缓冲区上的输入流中接收顶点数据,并且把数据项转换为规范的格式.vertex shader通常用来把顶点从模型空间变换到平面空间,vertex shader读取一个顶点,输出一个顶点.Pixel Shader读取单一pixel属性,输出包含颜色和Z信息的的片断.而geometry shader是Dir

Unity Geometry Shader实现

unity官方文档关于geometry shader的内容等同于没有,这也是因为unity的开发者基本面向的是移动平台开发,所以这种SM4.0的特性基本都不会被开发者考虑.但是本着与时俱进的精神(虽然现在已经不早了)还是研究一下以备不时之需. 在开始unity geometry shader之前,通过DX10的龙书,简单的了解了一下geometry shader的原理.然后看了一个GS的billboard例子,觉得大同小异. 首先要知道,GS和VS以及FS的区别. 在dx9的渲染管线中,可编程的

Geometry shader总结

什么是Geometry Shader GS存在于vertext shader和固定功能vertex post-processing stage之间,它是可选的不是必要的.GS的输入是单个primitive,输出可能是0个或多个primitive. GS的作用 GS的主要作用就是从已有的primitive中生成新的primitive,它可以"无中生有"的生成新的顶点 OpenGL官网上提到两种用法: Layered rendering: 对一个primitive,不改变rendertar

Vulkan Tutorial 11 Shader modules

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不是像GLSL和HLSL这样具有比较好的可读性的语法.此字节格式成为SPIR-V,它可以与Vulkan和OpenCL一同使用.这是一种可以编写图形和计算着色器的格式,但我们重点介绍本教程中Vulkan图形流水线使用的着色器. 使用二进制字节码格式的优点之一是 使得GPU厂商编写将着色器代码转换为本地代

osg中使用geometry shader方式

可以参考osg示例代码osggeometryshaders 它用glsl版本比较老#version 120 #extension GL_EXT_geometry_shader4 : enable 使用gl_PositionIn[],而不能使用gl_in[],这个需要更高版本 类似以下代码: #version 150 layout(triangles) in; layout(triangle_strip, max_vertices=3) out;vec4 p0_3d = gl_in[0].gl_P