Opengl 有没有方法可以创建立方体的顶点/索引,这些顶点/索引既可以用线条绘制模式表示,也可以用三角形模式正确渲染?

Opengl 有没有方法可以创建立方体的顶点/索引,这些顶点/索引既可以用线条绘制模式表示,也可以用三角形模式正确渲染?,opengl,3d,rendering,vertex,wireframe,Opengl,3d,Rendering,Vertex,Wireframe,当多维数据集的顶点数据主要用于GL_三角形时,尝试将绘图模式切换到GL_线、GL_线或GL_线或GL_环会产生一些有趣的结果,但没有一个结果能够提供多维数据集的良好线框表示 是否有一种方法可以构造立方体的顶点和索引数据,从而只需在GL_线/GL_线/GL_带/GL_线/GL_环和GL_三角形之间切换绘制模式,即可获得很好的结果?或者,获得良好线框以重新创建顶点的唯一方法是专门用于其中一种线模式吗?最实用的方法很可能是最简单的方法:使用单独的索引数组进行线和三角形渲染。当然,不需要复制顶点属性,但

当多维数据集的顶点数据主要用于GL_三角形时,尝试将绘图模式切换到GL_线、GL_线或GL_线或GL_环会产生一些有趣的结果,但没有一个结果能够提供多维数据集的良好线框表示


是否有一种方法可以构造立方体的顶点和索引数据,从而只需在GL_线/GL_线/GL_带/GL_线/GL_环和GL_三角形之间切换绘制模式,即可获得很好的结果?或者,获得良好线框以重新创建顶点的唯一方法是专门用于其中一种线模式吗?

最实用的方法很可能是最简单的方法:使用单独的索引数组进行线和三角形渲染。当然,不需要复制顶点属性,但是使用相同的索引绘制完全不同的基本体类型听起来非常有问题

为了实现这一点,您可以使用两个不同的索引(
GL\u ELEMENT\u ARRAY\u BUFFER
)缓冲区。或者,更优雅地说,使用一个缓冲区,并在其中存储两组索引。假设需要
triIdxCount
索引进行三角形渲染,需要
lineIdxCount
进行线条渲染。然后,您可以使用以下设置索引缓冲区:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
             (triIdxCount + lineIdxCount) * sizeof(GLushort), 0,
             GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
                0, triIdxCount * sizeof(GLushort), triIdxArray);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
                triIdxCount * sizeof(GLushort), lineIdxCount * sizeof(GLushort),
                lineIdxArray);
然后,在准备绘制时,设置所有状态,包括索引缓冲区绑定(理想情况下,所有状态设置都使用VAO),然后有条件地渲染:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
if (renderTri) {
    glDrawElements(GL_TRIANGLES, triIndexCount, GL_UNSIGNED_SHORT, 0);
} else {
    glDrawElements(GL_LINES, lineIdxCount, GL_UNSIGNED_SHORT,
                   triIndexCount * sizeof(GLushort));
}
从内存使用的角度来看,拥有两组索引是一种适度的开销。实际的顶点属性数据通常比索引数据大得多,这里的关键点是属性数据没有被复制


如果您不想严格地渲染线,而只是需要线框类型的渲染,那么还有其他选项。例如,有一种优雅的方法(我自己从未实现过,但它看起来很聪明),其中仅在多边形边界附近绘制像素,并根据到多边形边缘的距离丢弃片段着色器中的内部像素。这个问题(我在这里提供了答案)详细阐述了该方法:。

使用两个索引数组是否可以接受?您不需要复制实际的顶点数据,但根据您是绘制直线还是绘制三角形,可以使用单独的索引数组。这是一个比完全没有解决方案更好的解决方案。如果您不在乎使用不推荐的功能,可以提供一些:)