OpenGL:跳过GL_TRIANGLE_STRIP中的每个n四元组

时间:2018-03-27 17:13:53

标签: c++ opengl

我目前正在使用:

渲染一条长路径
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2000);

我将控制点传递给这样的vbo:

for (unsigned int i = 0; i < lPoints.size() && i < rPoints.size(); ++i)
{
    if (i % 2 != 0)
    {
        vbo.AddData(&rPoints[i], sizeof(glm::vec3));
        vbo.AddData(&m_textCoords[i], sizeof(glm::vec2));
        vbo.AddData(&normal, sizeof(glm::vec3));
    }
    else
    {
        vbo.AddData(&lPoints[i], sizeof(glm::vec3));
        vbo.AddData(&m_textCoords[i], sizeof(glm::vec2));
        vbo.AddData(&normal, sizeof(glm::vec3));
    }
}

以下图为例。我现有的代码成功地将所有四边形绘制在一起以形成路径。但我想要实现的是绘制一个四边形并按顺序跳过一个四边形。即绘制三角形[v0,v1,v2]和[v2,v1,v3]。跳过[v2,v3,v4]和[v4,v3,v5]。

Triangle Strip

在这一段时间里一直没法成功。有什么建议?

2 个答案:

答案 0 :(得分:2)

要跳过对象的渲染,您有以下几种方法:

A)不要将它们放在VBO缓冲区中。

B)将唯一的glDrawArrays调用分成多个调用,每个调用从缓冲区中的不同位置开始(glDrawArrays的第二个参数)。

C)为该基元设置特殊颜色(或其他属性)。如果着色器符合此颜色丢弃片段(在片段着色器中)或不在几何着色器中发出顶点。

D)正如@ Rabbid76建议的那样,使用索引绘图和原始重启。

答案 1 :(得分:2)

绘制三角形基元(GL_TRIANGLES),而不是绘制三角形条带原点(GL_TRIANGLE_STRIP),它必然意味着连接的拓扑结构。

你不能使用相同的顶点流。

当前渲染GL_TRIANGLE_STRIP并传递顶点的位置:

ABCDEFGHIJ ...

enter image description here

你现在必须传入GL_TRIANGLES并传入每个四边形的两个三角形(在你的情况下每隔一个四边形)。

ABC CBD EFG GFH ...

请注意绕线顺序,因为在一个条带中,每隔一个三角形绕另一个方向缠绕。 (诱惑以ABC BCD EFG FGH ...的顺序发送顶点,但每隔一个三角形将逆时针 - 相反的缠绕顺序。)

要使用相同的顶点流,请绘制索引基元,并使用索引缓冲区:012 213 456 657 ...