当面片大小 > 4 时,曲面细分如何知道面中哪些顶点属于一起?

Sti*_*ert 4 opengl

当不使用曲面细分着色器时,您可以传递基元类型(GL_TRIANGLESGL_TRIANGLE_STRIP等),让 OpenGL 知道顶点流如何表示几何面。

使用曲面细分着色器GL_PATCHES替换这些原始类型枚举。当处理大小为 3 或 4 的面片并将 TES 中的相应布局设置为三角形或四边形时,这在我的脑海中是有意义的。

但是如果我有一个大小为 16 的面片(有些教程这样做),TPG 如何知道哪些 3 或 4 个顶点形成哪些面?我已经多次读到,顶点缓冲区中的顺序在GL_PATCHES使用时并不重要,但肯定存在一个点,其中一组特定的 3 个顶点被视为三角形(传递给例如几何着色器)。这是如何决定的?

Nic*_*las 5

实际的曲面细分硬件实际上并不使用您的补丁数据。曲面细分单元是管道中实际生成三角形(或线)的部分,对抽象补丁进行操作。如果您的 TES 指定抽象面片是四边形,则曲面细分器将在单位四边形上执行曲面细分。

有多少个面片顶点与此过程完全无关。

TES 有点像顶点着色器;每个顶点都会调用一次。但不是基元中的每个顶点GL_PATCHES它曾经是细分图元的每个顶点。因此,如果您对四边形进行细分,并且外部层为 (4, 4, 4, 4),内部层为 (4, 4),则将生成 25 个顶点。TES 将被调用多次(至少;对于同一顶点它可以被调用多次),并且它将被告知该特定顶点在抽象补丁中的位置。

TES 的工作是决定如何使用抽象面片坐标和真实面片顶点数据来生成供渲染管道使用的实际每顶点数据。例如,如果您要创建贝塞尔曲线面片,则将有 16 个面片顶点。TES 的工作是获取抽象面片坐标并使用双三次贝塞尔插值将面片上的 16 个位置插值到抽象面片中的特定位置。这成为输出位置。法线、纹理坐标和其他数据可以类似地计算。