使用OpenGL无法正确显示三角形条带

时间:2017-11-09 19:59:31

标签: c++ c++11 opengl

我在C ++中实现了一个函数,为一个三角形条带( 2 x N 三角形)生成 N 段,以便稍后打印(如 GL_TRIANGLE_STRIP )由另一个函数。在这里,我向您展示我到目前为止所做的事情:

void strip(
    std::uint32_t N,
    std::vector<glm::vec3>* vertices)
{

    vertices->clear();

    for (std::uint32_t j=0; j<=N; ++j) 
    {
        for (std::uint32_t i=1; i<=N; ++i)
        {
            float x = (float)i/(float)N;
            float y = (float)j/(float)N;
            vertices->push_back(glm::vec3(x, y, 0));
        }
    }
}

所以它看起来像下图(对于 N = 3 ):

    ^
    |  ----------
    |  | /| /| /|
  y |  |/ |/ |/ |
    |  ----------
    |
    |-------------->
            x

但实际上看起来像这样:

My triangle strip

有关它的任何建议吗?我的想法是,我没有按照正确的顺序生成积分。

2 个答案:

答案 0 :(得分:3)

生成一条三角形的逻辑并不好。让我试着解释一下:

FUNCTION min (ARRAY x)
    IS x INVALID?
    THEN EXIT WITH ERROR

    INSTANTIATE min_x AS OBJECT LIKE IN x

    LOOP ON EACH OBJECT IN x AS xi
        IS min_x INITIALIZED?
        THEN
            IS xi SMALLER THAN min_x?
            THEN SET min_x AS xi
        ELSE SET min_x AS xi
    CONTINUE LOOP

    IS min_x INITIALIZED?
    THEN RETURN min_x
    ELSE EXIT WITH ERROR
END FUNCTION

尽可能地,三角形0由顶点0,1和2组成,而三角形1由顶点1,2和3组成,依此类推。因此,要生成此条带,您需要在一行中生成奇数索引,在另一行中生成偶数索引。让我们尝试使用代码,在这种情况下生成顶点:

    ^
    |  0--2--4--6
    |  | /| /| /|
  y |  |/ |/ |/ |
    |  1--3--5--7
    |
    |-------------->
            x

答案 1 :(得分:0)

具有顶点A,B,C,D,E,...的三角形条将形成三角形ABCBCDCDE,依此类推。

  

我的想法是,我没有按照正确的顺序生成积分。

是。你生成的是

0  1  2  3
4  5  6  7
8  9 10 11

所以你得到很多没有面积的变形三角形,只能得到一些连接不同线条的奇怪三角形(如2 3 4和3 4 5)。

你应该生成什么

0  2  4  6
1  3  5  7

请注意,添加其他行时,必须重复上一行的底部顶点作为新行的顶部顶点。还要注意,你必须为每一行重新启动三角形条。

更有效的方法可能就是像现在一样生成顶点,并查看indexed rendering,这将允许您只重用不同基元之间的顶点。