opengl 当面片大小>4时,细分如何知道哪些顶点属于同一个面?

pqwbnv8z  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(110)

不使用镶嵌着色器时,可以传递基本类型(GL_TRIANGLESGL_TRIANGLE_STRIP等)以让OpenGL知道顶点流如何表示几何体面。
使用Tessellation着色器,GL_PATCHES替换了这些基本类型的枚举。在我看来,当处理大小为3或4的面片,并将TES中相应的布局设置为三角形或四边形时,这是有意义的。
但是如果我有一个大小为16的面片(有些教程是这样做的),TPG如何知道3个或4个顶点形成了哪些面?我读过很多次,当使用GL_PATCHES时,顶点缓冲区中的顺序并不重要,但肯定会有一个点,其中一组特定的3个顶点被认为是三角形(传递给几何着色器)。这是如何决定的?

5hcedyr0

5hcedyr01#

实际的曲面细分硬件并不使用你的面片数据。曲面细分单元,实际生成三角形(或直线)的管道部分,在抽象面片上操作。如果你的TES指定抽象面片是一个四边形,那么曲面细分器将在一个单元四边形上执行曲面细分。
有多少面片顶点与此过程完全无关。
TES有点像顶点着色器;每个顶点调用一次。但不是GL_PATCHES基元中的每个顶点。它是 tessellated 基元中的每个顶点调用一次。所以,如果你镶嵌一个四边形,你的外层是(4,4,4,4),内层是(4,4),这将生成25个顶点。TES将被调用那么多次(至少;对于同一个顶点,可以多次调用它),并且它将被告知该特定顶点在抽象面片中的位置。
TES的工作是决定如何使用抽象面片坐标和真实的面片顶点数据来生成渲染流水线要使用的实际逐顶点数据。您将拥有16个面片顶点。TES'的工作是获取抽象面片坐标,并使用双三次贝塞尔插值将面片上的16个位置插值到中的特定位置抽象面片。2它将成为输出位置。3法线、纹理坐标和其他数据可以类似地计算。

vh0rcniy

vh0rcniy2#

简短的回答是:TPG(Tessellation Primitive Generator,细分图元生成器)根本不知道/不关心面片大小。
TPG只关心镶嵌评估着色器(三角形、四边形、等值线)的指定输入布局和控制着色器设置的镶嵌级别。它不能访问面片本身,但只根据该镶嵌中使用的类型和级别生成镶嵌坐标。
然后,用户在Tessellation评估着色器中负责建立每个控制点参数(从Tessellation控制着色器传递,由in/out提供,某种程度上类似于变量)和gl_TessCoord(来自TPG)之间的关系。
请注意,每个控制点参数的数量和镶嵌坐标的数量不一定相同。
要进一步阅读,以下文章可能会有所帮助:Primitive Processing in Open GL,尤其是图8.1

相关问题