NurbsSurface的理解

Understanding of NurbsSurface

我想在 OpenGL 中创建一个 NurbsSurface。我使用 40x48 大小的控制点网格。此外,我创建索引以确定顶点的顺序。

这样我创建了我的三角形表面。 只是为了避免误会。我有 float[] vertices=x1,y1,z1,x2,y2,z2,x3,y3,z3.......float[] indices= 1,6,2,7,3,8.... 现在我不想画三角形了。我想插入表面点。我想到了 nurbs 或 B-Splines。

线索是: 为了确定 Nurbs 算法,我必须逐块插值。在我的理解中,一个补丁被定义为例如点 1,6,2,7 或 2,7,3,8(请打开图片)。

首先我创建了顶点和索引以便使用顶点着色器。 但实际上用老方法画就够了。在这种情况下,我将按如下方式确定顶点和索引:

float[] vertices= v1,v2,v3... with v=x,y,z 

float[] indices= 1,6,2,7,3,8....

在 OpenGL 中,有一个 Nurbs 函数可以使用。 glNewNurbsRenderer。所以我可以很容易地渲染一个补丁。 不幸的是,我在这一点上失败了,如何将补丁拼接在一起。我找到了一个解释 Teapot example 但是(也许我对此很着迷)我无法将解决方案转移到我的案例中。你能帮忙吗?

您有一组要从中绘制曲面的控制点。

您可以通过两种方式解决此问题

  1. 您提供的茶壶示例 link 中对此进行了描述。 从控制点计算顶点,然后向下传递图形 以 GL_TRIANGLE 作为拓扑的管道。请记住图形硬件 需要三角化数据才能绘制。 按照这个 link 显示如何从控制点评估顶点 http://www.glprogramming.com/red/chapter12.html

  2. 您可以准备控制点的路径并使用曲面细分着色器 三角化并缝合这些点。

    为此你准备了一组控制点作为补丁使用GL_PATCH原语 并将其传递给曲面细分控制着色器。在此您将指定什么 你想要的镶嵌级别。取决于你的补丁将被镶嵌 通过另一个称为原始生成器的固定功能阶段。 然后您生成的顶点将传递给曲面细分评估着色器 您可以在其中进行微调。您可以在此处指定外部或内部镶嵌 将进一步细分您的补丁的级别。

    我建议你像控制点一样放置 VBO 和 IBO,并且在绘图时使用 GL_PATCH 原语。按照以下教程了解如何使用曲面细分着色器绘制 nurb 曲面。

注意:我建议的第二种方法有点棘手,您将不得不阅读大量研究论文。

我认为如果您不想使用现代管道,那么我建议您使用选项 1。