这是绘制圆柱基元的代码:
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0, height / 2.0f, 0);
for (int i = 0; i < SIDENUMS +1; i++)
{
glVertex3f(radius * cos(i * 2 * PI / SIDENUMS), height / 2.0f, radius * sin(i * 2 * PI / SIDENUMS));
}
glEnd();
glBegin(GL_QUADS);
for (int i = 0; i < SIDENUMS + 1;i++)
{
glVertex3f(radius * cos(i * 2 * PI / SIDENUMS), height / 2.0f, radius * sin(i * 2 * PI / SIDENUMS));
glVertex3f(radius * cos(i * 2 * PI / SIDENUMS), -height / 2.0f, radius * sin(i * 2 * PI / SIDENUMS));
glVertex3f(radius * cos((i+1) * 2 * PI / SIDENUMS), -height / 2.0f, radius * sin((i+1) * 2 * PI / SIDENUMS));
glVertex3f(radius * cos((i+1) * 2 * PI / SIDENUMS), height / 2.0f, radius * sin((i+1) * 2 * PI / SIDENUMS));
}
glEnd();
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0, -height / 2.0f, 0);
for (int i = 0; i < SIDENUMS + 1; i++)
{
glVertex3f(radius * cos(i * 2 * PI / SIDENUMS), -height / 2.0f, radius * sin(i * 2 * PI / SIDENUMS));
}
glEnd();
输出如下图所示:
现在在图片中,请注意A点。
这一点已经绘制了两次,一次是在TRIANGLE_FAN中,另一次是在GL_QUADS中,我的问题是,这两个不同的点是否相互自动焊接成一个点?或者他们在彼此之上?总结一下有多少分?一个或两个 ?如果它们没有彼此焊接,我该如何解决?
答案 0 :(得分:0)
这两个不同点自动相互焊接成一个点吗?
不。
或者他们在彼此之上?
是的。
有多少分?一个或两个 ?
两个
如果这对你很重要,你必须融合客户端的顶点。 OpenGL中没有神奇的合并。
答案 1 :(得分:0)
三角形扇形基元在创建三角形时重复使用“点”,但对于四边形,每次调用glVertex3f (...)
都会产生一个“点”。
换句话说:
使用三角形扇形时,第一个三角形需要转换3个顶点,每个跟随三角形只需要1个新顶点(并重复使用2个)。这对post-T&L cache效率至关重要,这是您在问题中最终得到的概念。
当您使用顶点数组和glDrawElements (...)
或共享顶点的基本模式(例如粉丝和条带)时,您可以避免必须多次转换相同的点。但是,如果您使用的per-vertex属性多于示例中的属性,则可能不实用。也就是说,如果您正在绘制的对象的每个边都有一组不同的纹理坐标或同一空间位置的法线。