【问题标题】:How do I draw multiple objects in OpenGL?如何在 OpenGL 中绘制多个对象?
【发布时间】:2013-11-14 02:56:54
【问题描述】:

我想绘制两个单独的对象,以便在绘制第二个对象时执行查询。绘图代码将如下所示:

glDrawElements(GL_TRIANGLES,...);  // draw first object

glBeginQuery(GL_SAMPLES_PASSED, queries[0]);

glDrawElements(GL_TRIANGLES,...);  // draw second object

glEndQuery(GL_SAMPLES_PASSED);

glGetQueryObjectiv(queries[0], GL_QUERY_RESULT, &result);

return restult;

大多数 OpenGL 教程都不会超出单个 glDraw*() 命令。据我了解this site 我需要两个顶点数组对象,但该站点没有解释如何为单独的对象设置缓冲区数据。为了简单起见,假设我希望每个对象都是一个三角形:

Triangle1:
vertex1: -0.5, 0.0, 0.0
vertex2: -0.5, 0.5, 0.0
vertex3:  0.0, 0.0, 0.0

Triangle2:
vertex1: 0.0, 0.0, 0.0
vertex2: 0.5, 0.5, 0.0
vertex3: 0.5, 0.0, 0.0

谁能告诉我如何设置顶点数组对象、顶点缓冲区对象和元素数组缓冲区以在 C++ 和 OpenGL 3.2 中执行此查询?

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    您绘制几何图形的代码遗漏了两个基本步骤:

    1. 创建 GL_ARRAY_BUFFER(glGenBuffers、glBindBuffer、glBufferData)
    2. 绘图状态机与数组缓冲区的关联(调用 gl…指针函数)

    它允许绘制多个网格。

    【讨论】:

    • 那么我需要创建一个 GL_ARRAY_BUFFER 和 GL_ELEMENT_ARRAY_BUFFER 以及在每个 glDraw* 命令之前设置每个 glVertexAtribPointer 吗?我还需要另一个顶点数组对象吗?
    • @NealKruis:您可以在每次绘图调用之前重新设置 gl…指针,或者您可以调整基本索引,或者您只是让绘图调用仅使用元素索引数组的子集缓冲。顶点数组对象是 gl…Pointer 绑定的容器,所以你通常要么 gl…Pointer 绑定调用,要么使用多个 VAO;你很少混合它们。
    【解决方案2】:

    几个建议:

    您可以绘制一组互不相连的三角形,在视觉上看起来像是两个对象。

    您还可以创建两个单独的 OpenGL 上下文。您要绘制的每个对象的一个​​上下文。绘制每个对象时,将关联的上下文设为“当前”上下文并进行绘制调用。

    【讨论】:

    • 查询仅在单独绘制时有效(不能作为一个集合同时绘制)。将三角形绘制在一起也很重要,因为我想知道是否有像素丢失,因为一个三角形与另一个三角形重叠。
    • 多个对象的多个 OpenGL 上下文?怎么回事?!不!不要这样做!通常,您只想创建一个 OpenGL 上下文并尽可能使用它。 -1 表示此类误导性信息。
    • @Jay:因为切换上下文是昂贵的。假设你必须分离对象,很有可能绘制它们所需的 OpenGL 状态实际上是相同的。投影、视口、照明设置(灯光位置和颜色)、视点很可能是相同的。事实上,推荐的做法是对对象绘图进行排序,以最大限度地减少状态更改的次数。切换上下文是一种核心的状态变化,你想不惜一切代价避免这种情况。
    • @Jay:实际上,使用分离的 OpenGL 上下文只有一个原因:如果您的 OpenGL 代码必须与对您来说是一个黑盒子的其他 OpenGL 代码协作。然后使用不同的 OpenGL 上下文来避免破坏程序的其他部分。
    • @Jay:给你另一个视角:每个 OpenGL 上下文都消耗一个完整的操作系统句柄对象。操作系统句柄是重量级的。通过使用单独的 OpenGL 上下文来管理单独的对象,就像您编写文本将每个单词放入自己的单独文件中,然后将这些文件与包含或类似内容链接在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多