带有曲面细分着色器的GL_Triangles

时间:2014-06-06 06:19:47

标签: opengl

当我使用Tessellation Shaders时,我是否必须从CPU程序补丁而不是三角形传递?。

    glDrawArrays(GL_PATCHES, 0, 3); //Works with Tess Shaders

    glDrawArrays(GL_TRIANGLES, 0, 3); //Works not with Tess Shaders

什么是修补程序,可视化它?它可以是一个被细分的三角形吗?

1 个答案:

答案 0 :(得分:6)

补丁只是一个没有真正内在结构的点的集合......你的TCS和TES是有意义的。与GL_TRIANGLES(由3个顶点严格定义)不同,GL_PATCHES每个补丁没有预定义的顶点数。您可以使用以下方法自行设置补丁中的顶点数:

glPatchParameteri ​(GL_PATCH_VERTICES​​, N);
// where N is some value less than GL_MAX_PATCH_VERTICES

然后,每个N - 绘制的顶点定义了一个新的补丁基元。

补丁实际上只是用于评估曲面的控制点的集合。这就是为什么有一个名为Tessellation Control Shader可选阶段将数据提供给Tessellation Evaluation Shader的原因。如果没有关于您正在评估的表面类型的更多详细信息,关于它们可视化的唯一方法是作为点云(例如GL_POINTS)。

更新

假设您正在讨论Bézier surface,那么可以将控制点可视化:

Bezier Surface

红点是控制点(GL_PATCHES中的顶点),蓝线是人工的(仅为了可视化),黑色方块是评估表面(曲面细分评估着色器的结果)。如果您在镶嵌细分评估之前尝试将其显示为可视化,那么您的补丁将只是红点,您可能会想要了解它们。