Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 对nurbs曲面的理解_Algorithm_Opengl_Surface_Nurbs - Fatal编程技术网

Algorithm 对nurbs曲面的理解

Algorithm 对nurbs曲面的理解,algorithm,opengl,surface,nurbs,Algorithm,Opengl,Surface,Nurbs,我想在OpenGL中创建一个NurbsSurface。我使用尺寸为40x48的控制点网格。此外,我创建索引以确定顶点的顺序 这样我就创建了我的三角形曲面。 只是为了避免误解。我有 float[]顶点=x1、y1、z1、x2、y2、z2、x3、y3、z3…… float[]指数=1,6,2,7,3,8.. 现在我不想画三角形了。我想插值曲面点。我想到了nurbs或B样条曲线 线索是: 为了确定Nurbs算法,我必须逐块插值。根据我的理解,一个补丁被定义为例如点1、6、2、7或2、7、3、8(请打

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

这样我就创建了我的三角形曲面。 只是为了避免误解。我有
float[]顶点=x1、y1、z1、x2、y2、z2、x3、y3、z3……
float[]指数=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 

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

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

有两种方法可以做到这一点

  • 这在您提供的茶壶示例链接中进行了描述。 从控制点计算顶点,然后向下传递图形 以GL_三角形作为拓扑的管道。请记住图形硬件 需要三角化数据才能绘制。 遵循此链接,该链接显示如何从控制点计算顶点

  • 可以准备控制点的路径,并使用细分着色器 三角测量并缝合这些点

    为此,您将准备一组控制点作为“面片使用GL_面片原语” 并将其传递给细分控制着色器。在这里,您将指定 您需要的细分级别。这取决于您的面片将被细分 由另一个称为原始生成器的固定函数级执行。 然后,生成的顶点将传递给细分计算着色器 您可以在其中进行微调。在这里可以指定外部或内部细分 将进一步细分您的补丁的级别

    我建议您将VBO和IBO放在控制点上,并在绘制时使用GL_面片原语。遵循以下教程,了解如何使用细分着色器绘制nurb曲面

  • 注意:我建议的第二种方法有点棘手,你需要阅读大量的研究论文


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

    好的,我认为我混淆了顶点和控制点。将三角形发送到图形管道后,我需要如何使用glNurbssurface?只需遵循nurbs命令,并将所有控制点作为浮点输入即可?除此之外,我还发现了一个几何体着色器代码,我也可以使用它吗?据我所知,在图形管道中,几何体着色器位于选项1中提到的顶点着色器之后,您可以使用gluNurbSurface功能。他们还展示了如何从控制点计算顶点位置。在VBO中填充顶点位置后,只需使用GL_三角形进行法线绘制。是的,您也可以使用几何体着色器。但请记住,几何体着色器对性能非常不利,因为输入程序集阶段必须在几何体着色器之前和之后运行。几何体着色器实际上位于细分着色器之后,但如果您不使用它们,则“是”几何体着色器位于顶点着色器之后。谢谢,我想您已经清除了它。最后一个问题,关于选项2,细分着色器,您有很好的教程吗?因为程序应该在开发一段时间后实时运行。当然,请参阅下面的链接。
    float[] indices= 1,6,2,7,3,8....