现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面。细分网格 应该为我们提供了足够的顶点来对曲面进行采样(如果我们想要更多的话,我们可以增加 内部/外部细分级别)。我们现在需要的是通过管线发送控制点,然后使用这些控制点执行计 算以将细分网格转换为我们所需的贝塞尔曲面。 假设我们希望建立一个立方体贝塞尔曲面,我们将需要16 个控制点。我们可以通过VBO 从C++端发送它们,或者我们可以在顶点着色器中硬编码写死它们。 现在是更准确地解释曲面细分控制着色器(TCS)如何工作的好时机。与顶点着色器类 似,TCS 对每个传入顶点执行一次。另外,回想一下第2 章,OpenGL 提供了一个名为 gl_VertexID 的内置变量,它保存一个计数器,指示顶点着色器当前正在执行哪次调用。曲 面细分控制着色器中存在一个类似的内置变量gl_InvocationID。 曲面细分的一个强大功能是TCS(以及TES)着色器可以同时访问数组中的所有控制 点顶点。首先,当每个调用都可以访问所有顶点时,TCS 对每个顶点执行一次可能会让人 感到困惑。在每个TCS 调用中,冗余地在赋值语句中指定曲面细分级
1