编写曲面细分评估着色器
译者注:示例代码点击此处
细分评估是细分过程中的第二个可编程阶段。当几何体已经细分并且用于收集细分结果以形成新顶点并进一步修改它们时,将执行该操作。启用细分后,我们需要编写细分评估着色器来获取生成的顶点的位置,并将它们提供给相连的管线阶段。
怎么做...
1.创建一个扩展名为tese的文本文件(例如,shader.tese)。
2.在文件的第一行插入版本450。
3.使用in layout限定符,定义形成的基元primitive(isolines,triangles或quads)的类型,形成的顶点之间的间距(spacing)(equal_spacing,fractional_even_spacing或fractional_odd_spacing),以及生成的三角形的绕序(winding)(cw保持应用程序中提供的绕组,ccw反转应用程序中提供的绕组):
layout( <primitive>, <spacing>, <winding> ) in;
4.定义从曲面细分控制阶段提供的一组输入数组变量。 对于每个输入变量:
1.使用位置布局(location layout)限定符和属性索(index)引定义其位置:
layout( location = <index> )
2.提供in限定符
3.指定输入变量的类型(如vec2或int3)
4.提供输入变量的唯一名称
5.确保它被定义为数组
5.如有必要,定义一个输出变量,该变量将被传递(并插入,除非另有说明)到后面的流水线阶段。 要定义每个输出变量:
1.用位置布局(location layout)限定符和属性索(index)引定义其位置:
layout( location = <index> )
2.指定out存储限定符
3.指定输出变量的类型(例如vec4)
4.选择输出变量的唯一名称
6.如有必要,定义与应用程序中创建的描述符资源相对应的uniform变量,细分评估阶段可以访问这些资源:
1.指定描述符集的数量和可以访问给定资源的绑定号:
layout (set=<set index>, binding=<binging index>)
2.提供uniform限定符
3.指定变量的类型(例如sampler,image1D)
4.定义变量的唯一名称。
7.创建一个void main()函数,其中:
1.执行所需的操作
2.使用内置的gl_TessCoord向量变量,使用所有片段顶点的位置生成新顶点的位置; 修改结果以获得所需的结果,并将其存储在gl_Position内置变量中
3.以类似的方式,使用gl_TessCoord生成所有其他输入变量的插值并将它们存储在输出变量中(如果需要,还可以进行其他转换)。
这个怎么运作...
曲面细分控制和评估着色器形成两个可编程阶段,以使曲面细分正常工作。 它们之间是基于控制阶段中提供的参数进行实际曲面细分的阶段。 在评估阶段获取曲面细分的结果,其中它们被应用以形成新的几何形状。
通过曲面细分评估,我们可以控制新图元的对齐和形成方式:指定它们的绕序顺序和生成的顶点之间的间距。 我们还可以选择是否希望曲面细分阶段创建等值线,三角形或四边形。
新的顶点不是直接创建的——细分着色器只为新的顶点(权重)生成重心细分坐标,这些新顶点(权重)在内置的gl_TessCoord变量中提供。我们可以使用这些坐标在形成面片的顶点的原始位置之间进行插值,并将新顶点放置在正确的位置。评估着色器虽然每个生成的顶点执行一次,但可以访问形成面片的所有顶点。 它们的位置是通过内置数组变量gl_in []的gl_Position成员提供的。
对于常用的三角形,只是在没有进一步修改的情况下传递新顶点的曲面细分评估着色器可能如下所示:
#version 450
layout( triangles, equal_spacing, cw ) in;
void main() {
gl_Position = gl_in[0].gl_Position * gl_TessCoord.x +
gl_in[1].gl_Position * gl_TessCoord.y +
gl_in[2].gl_Position * gl_TessCoord.z;
}