使用glDrawElement的OpenGL渲染问题

时间:2012-11-01 21:33:56

标签: opengl rendering vbo

当谈到我应该用于OpenGL Deferred Rendering的函数时,我有点困惑。

我有一个VBO(顶点缓冲对象)列表

每一个都代表一种顶点类型,一个可能是(位置+颜色)

我还有一个用于indeces

当我想要渲染不同的对象时,我的问题出现了

即时使用你所在的directX方式 1)激活你的顶点缓冲区 2)激活索引缓冲区 3)然后在绘图调用中指定原始类型  顶点缓冲区的起始顶点,最小顶点索引,顶点计数,起始指标和原始计数

因为我可以使用openGL而丢失了:

glDrawElements - 但它使用渲染模式,对象计数,indice字节类型和索引

这基本上告诉我它将在VBO的开头呈现,如果我有多个对象,它将无法帮助我。

任何人都知道openGL具有哪些渲染功能,我可以指定VBO中从哪里开始渲染并指定我的起始顶点位置?我希望有人有任何想法= \

3 个答案:

答案 0 :(得分:1)

glDrawElements不是从VBO的开头开始,而是从指定要开始的指针的任何地方开始。

如果你有一个VBO并且你想从它的后半部分开始渲染,那么你将字节偏移设置为从glVertexAttribPointer的最后一个属性开始。

答案 1 :(得分:0)

编辑:我刚刚意识到,如果你不使用着色器,这可能不适用,但由于我不熟悉传统的OpenGL,我不确定我的帖子对你有什么好处。您使用/定位的是什么版本?

我最近问了一个关于glDrawElements here的问题。希望我发布的内容给出一些解释/示例。

我理解它的方式:你的索引是由决定的,所以如果你想从第二个顶点开始,你可以尝试(一个基本的骨架,没有glVertexAttribPointer调用等等但是我可以添加那些,如果你想):

const float VBOdata = {
    //Some X and Y  coordinates for triangle1 (in the first quadrant)
    //(z = 0, w = 1 and are not strictly necessary here)
     0.0f,  1.0f, 0.0f, 1.0f //index 0
     0.0f,  0.0f, 0.0f, 1.0f  //1
     1.0f,  0.0f, 0.0f, 1.0f  //2

    //Some X and Y coordinates for triangle2 (in the second quadrant)
     0.0f, -1.0f, 0.0f, 1.0f  //3
     0.0f,  0.0f, 0.0f, 1.0f  //4
    -1.0f,  0.0f, 0.0f, 1.0f  //5

    //Now some color data (all white)
     1.0f, 1.0f, 1.0f, 1.0f,  //0
     1.0f, 1.0f, 1.0f, 1.0f,  //1
     1.0f, 1.0f, 1.0f, 1.0f,  //2

     1.0f, 1.0f, 1.0f, 1.0f,  //3
     1.0f, 1.0f, 1.0f, 1.0f,  //4
     1.0f, 1.0f, 1.0f, 1.0f,  //5
    };

const GLubyte indices[] = {
    3, 4, 5, 
};

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indices);

其中GL_TRIANGLES是基元的类型,3是“indices”内部的元素数,GL_UNSIGNED_BYTE是如何解释它们,“indices”只是数组的名称。

这应该只绘制第二个三角形。您也可以尝试glDrawElementsBaseVertex,但我自己并没有亲自尝试过。我收集的是你将从0开始生成/显式编码你的索引,但给出一个偏移量,使它实际上读取0 +偏移量,1 +偏移量,等等。

这有帮助吗?

答案 2 :(得分:0)

您有几种选择。

您可以在绘制该对象之前通过发出更多glVertexAttribPointer次调用来重新定位每个特定对象的顶点数据的开头。或者您可以使用glDrawElementsBaseVertex,在这里您可以指定一个顶点索引,该索引将所有索引的索引添加到。

后者应该可以在任何仍然支持的非英特尔硬件上使用。