我想在opengl中创建一个nurbssurface。我使用40x48大小的控制点网格。此外,我创建索引以确定顶点的顺序。
algorithm - 了解NurbsSurface-LMLPHP
这样我就创建了三角形的曲面。
只是为了避免误解。我有
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(请打开图片)。
首先,我创建了顶点和索引,以便使用VertexShader。
但事实上,这已经足够用老办法画出来了。在这种情况下,我将按如下方式确定顶点和索引:

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


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

在opengl中,有一个nurbs函数可以使用。glnewnurbrenderer。所以我可以很容易地渲染一个补丁。
不幸的是,我在这一点上失败了,如何将补丁缝合在一起。我找到了一个解释,但是(也许我已经被这个问题困扰了)我无法将解决方案转移到我的案例中。你能帮忙吗?

最佳答案

您有一组要从中绘制曲面的控制点。
有两种方法可以解决这个问题
这在您提供的茶壶示例链接中有描述。
从控制点计算顶点,然后向下传递图形
以glu三角形为拓扑的流水线。请记住图形硬件
需要三角化数据才能绘制。
按照此链接显示如何从控制点计算顶点
http://www.glprogramming.com/red/chapter12.html
可以准备控制点的路径,并使用镶嵌着色器
三角化并缝合这些点。
为此,您将一组控制点准备为patch use gl_patch primitive
并将其传递给细分控制明暗器。在这里您将指定
你想要的镶嵌级别。取决于你的补丁将被镶嵌
由另一个固定功能级称为原始生成器。
然后生成的顶点将传递到镶嵌求值着色器
你可以在其中微调。在这里可以指定外部或内部细分
这将进一步细分你的补丁级别。
我建议你把vbo和ibo放在控制点上,绘制时使用gl_patch原语。按照下面的教程学习如何使用镶嵌着色器绘制nurb曲面。
注:我建议的第二种方法有点棘手,你必须阅读大量的研究论文。
我想如果你不想采用现代管道,那么我建议你选择1。

08-27 04:40