4

我想在 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。所以我可以很容易地渲染一个补丁。不幸的是,我在这一点上失败了,如何将补丁缝合在一起。我找到了一个解释茶壶的例子 ,但是(也许我已经对此很着迷)我无法将解决方案转移到我的案例中。你能帮我吗?

4

1 回答 1

3

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

有两种方法可以解决这个问题

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

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

    为此,您准备一组控制点作为补丁使用 GL_PATCH 基元并将其传递给曲面细分控制着色器。在此您将指定您想要的细分级别。根据这一点,您的补丁将由另一个称为 Primitive Generator 的固定功能阶段进行细分。然后您生成的顶点将被传递到细分评估着色器,您可以在其中进行微调。在这里,您可以指定将进一步细分您的补丁的外部或内部细分级别。

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

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

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

于 2017-10-12T15:02:25.267 回答