【问题标题】:GL_Triangles with Tessellation Shaders带有镶嵌着色器的 GL_Triangles
【发布时间】:2014-06-06 06:19:46
【问题描述】:

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

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

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

究竟什么是补丁来可视化它?可以是被细分的三角形吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

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

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

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

    更新:

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

      

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

    【讨论】:

    • 那么补丁就是 N-Gon 吗?
    • 不,N-Gon 暗示了连接性。补丁中的顶点并不是真正直接连接的。说明这一点的最佳方式是向您展示bézier surface。它们是控制点,在评估曲线期间可能会创建许多新顶点... 是您可以开始讨论三角形或四边形等多边形的时候。但在评估镶嵌之前,您所拥有的只是补丁,没有多边形。
    • 如何在现代 OpenGL 中绘制蓝线?
    • 回答我的问题:使用 glDrawArrays 或 glDrawElements 和 GL_LINES 在两点之间画线,从而准备顶点数据或更好的顶点索引为:0,1,1,2,2,3, 3,0 绘制四边形(0,1,2,3)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多