我目前正在使用:
渲染一条长路径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]。
在这一段时间里一直没法成功。有什么建议?
答案 0 :(得分:2)
要跳过对象的渲染,您有以下几种方法:
A)不要将它们放在VBO缓冲区中。
B)将唯一的glDrawArrays
调用分成多个调用,每个调用从缓冲区中的不同位置开始(glDrawArrays
的第二个参数)。
C)为该基元设置特殊颜色(或其他属性)。如果着色器符合此颜色丢弃片段(在片段着色器中)或不在几何着色器中发出顶点。
D)正如@ Rabbid76建议的那样,使用索引绘图和原始重启。
答案 1 :(得分:2)
绘制三角形基元(GL_TRIANGLES),而不是绘制三角形条带原点(GL_TRIANGLE_STRIP),它必然意味着连接的拓扑结构。
你不能使用相同的顶点流。
当前渲染GL_TRIANGLE_STRIP并传递顶点的位置:
ABCDEFGHIJ ...
你现在必须传入GL_TRIANGLES并传入每个四边形的两个三角形(在你的情况下每隔一个四边形)。
ABC CBD EFG GFH ...
请注意绕线顺序,因为在一个条带中,每隔一个三角形绕另一个方向缠绕。 (诱惑以ABC BCD EFG FGH ...
的顺序发送顶点,但每隔一个三角形将逆时针 - 相反的缠绕顺序。)
要使用相同的顶点流,请绘制索引基元,并使用索引缓冲区:012 213 456 657 ...