使用Tessellation着色器的GL_Triangles

3
当我使用镶嵌着色器时,是否需要从CPU程序传递补丁而不是三角形?
    glDrawArrays(GL_PATCHES, 0, 3); //Works with Tess Shaders

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

“Patch”是什么意思?怎样才能更形象地理解它呢?它可以被想象成一个被细分的三角形吗?

1个回答

8
一个补丁只是一组没有真正内在结构的点...您的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中的顶点),蓝线是人工的(只是为了可视化),黑色正方形是评估表面(Tessellation Evaluation Shader的结果)。如果您在细分评估之前尝试可视化它,则您的补丁将仅由红点组成,并且您将花费很多时间来理解它们。

那么一个补丁就是一个N-Gon吗? - user1767754
1
不,N-Gon意味着连通性。补丁中的顶点实际上并没有直接连接。说明这一点的最好方法是向您展示贝塞尔曲面。它们是控制点,在计算曲线期间可能会创建许多新的顶点......那时,您可以开始谈论像三角形或四边形之类的多边形。但在细分求值之前,您只有补丁,没有多边形。 - Andon M. Coleman
你如何在现代OpenGL中绘制蓝色线条? - VisorZ
回答我的问题:使用glDrawArrays或glDrawElements与GL_LINES一起绘制两点之间的线条,因此准备顶点数据或更好的顶点索引为:0,1,1,2,2,3,3,0以绘制四边形(0,1,2,3)。 - VisorZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接