使用三角形列表(OpenGL)对BSpline补丁进行细分

时间:2013-07-07 16:19:21

标签: c++ opengl bezier bspline

正如标题所描述的那样,我正在尝试使用三角形列表对一个BSpline补丁进行细分。

这是我前面补丁的图片,看起来应该是这样的。

patch front

我的问题是补丁的后部,这会产生这种效果:

patch rear

如您所见,前一行三角形连接到正在绘制的新行。我已经尝试了各种方法来避免这种情况,例如当它到达行尾时将索引值增加1。我能找到的唯一快速解决方法是将每一行放在一个单独的循环中(因为该行的大小而具有循环范围),这根本不是直观的。

以下是我的补丁绘图的代码:

void drawBSplinePatch1(std::vector<int>& sample_elements_out, const int samples)
{
    for(int i = 0; i <= 379; i++)
    {
        // first triangle
        sample_elements_out.push_back(i);
        sample_elements_out.push_back(i + 1);
        sample_elements_out.push_back(i + samples);

        // second triangle
        sample_elements_out.push_back(i  + samples);
        sample_elements_out.push_back(i + 1);
        sample_elements_out.push_back(i + samples + 1);
    }
}

1 个答案:

答案 0 :(得分:0)

跳过每行的四边形,例如像这样。

for(int i = 0; i <= 379; i++)
{
    if (i % ROW_LENGTH != ROW_LENGTH - 1) {
      // first triangle
      sample_elements_out.push_back(i);
      sample_elements_out.push_back(i + 1);
      sample_elements_out.push_back(i + samples);

      // second triangle
      sample_elements_out.push_back(i  + samples);
      sample_elements_out.push_back(i + 1);
      sample_elements_out.push_back(i + samples + 1);
    }
}

但是,两个嵌套循环可能更具可读性。