2017-10-12 169 views
4

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

enter image description here

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

线索是: 为了确定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但是(可能我已经被这个迷住了)我无法将解决方案转移到我的案例中。你能帮我吗?

回答

3

您有一组控制点可供您从中绘制表面。

有两种方法,你可以去这个

  1. 在哪您提供茶壶例如链接描述

    。 计算控制点的顶点,然后向下传递图形 以GL_TRIANGLE作为拓扑的管道。请记住图形硬件 需要三角数据才能绘制。 请点击此链接,显示如何从控制点 http://www.glprogramming.com/red/chapter12.html

  2. 你可以准备控制点的路径,并使用镶嵌着色器 三角测量和缝合这些点计算顶点。

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

    我建议你把你的VBO和IBO像你有控制点,并绘制时使用GL_PATCH原语。请按照以下教程介绍如何使用曲面细分着色器绘制曲面。

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

我认为,如果你不想拥有现代化的流水线去,那么我建议去选择1

+0

好吧,我相信我混了顶点和控制点。将我的三角形发送到图形管道后,如何使用glNurbssurface?只需遵循nurbs命令并将所有控制点都设为浮点型?除此之外,我还找到了几何着色器代码http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.9155&rep=rep1&type=pdf,我可以使用它吗?由于我已经理解,在图形管道中,几何着色器位于顶点着色器的后面 – TimDor

+0

如在选项1中所述,您可以使用gluNurbSurface功能。他们还展示了如何从控制点计算顶点位置。一旦你有顶点位置填充他们在VBO,并使用GL_TRIANGLE做正常绘图。 –

+0

是的,你也可以使用几何着色器。但请记住,几何着色器对性能非常不利,因为输入组装阶段必须在几何着色器之前和之后运行。几何着色器实际上是在镶嵌着色器之后出现的,但如果不使用它们,那么是几何着色器在顶点着色器之后。 –