【问题标题】:Tessellating a BSpline patch using a triangle list (OpenGL)使用三角形列表 (OpenGL) 细分 BSpline 补丁
【发布时间】:2013-07-07 16:19:21
【问题描述】:

正如标题所描述的,我正在尝试使用三角形列表来细分 BSpline 补丁。

这是我的贴片从正面看的图像,看起来应该是这样的。

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

如您所见,前一行三角形连接到正在绘制的新行。我尝试了各种方法来避免这种情况,例如在到达行尾时将索引值增加 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);
    }
}

【问题讨论】:

  • 为什么为行和列设置单独的循环不直观?对我来说听起来很直接......?如果您希望人们理解您的问题,您可能应该发布循环......
  • 这不仅仅是因为它不直观,我最终会得到超过 100 个循环,最终会超过一个文件中允许的循环限制。
  • 所以你没有嵌套循环?我希望这恰好是两个嵌套循环。也许也发布部分工作版本——这可能会让人们展示如何以更紧凑的形式编写它。使用当前代码,很难猜出分解行的正确索引。
  • 对不起,循环是嵌套的,但我现在已经用下面发布的解决方案修复了它。这是我的第一篇文章,我会确保下次我更有形成性。谢谢你的帮助:)

标签: c++ opengl bezier bspline


【解决方案1】:

为每一行跳过一个四边形,例如像这样。

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);
    }
}

不过,两个嵌套循环可能更具可读性。

【讨论】:

  • 非常感谢!这已经让我绞尽脑汁了一段时间了。
  • Np;如果这适合您,请考虑接受正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2018-02-11
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2016-04-29
相关资源
最近更新 更多