0

当谈到我应该为我的 OpenGL 延迟渲染使用什么功能时,我有点困惑。

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

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

我也有一个 indeces

当我想渲染不同的对象时,我的问题就来了

我使用 DirectX 方式,您 1) 激活顶点缓冲区 2) 激活索引缓冲区 3) 然后在绘图调用中指定原始类型从顶点缓冲区的起始顶点、最小顶点索引、顶点计数、开始索引和原始计数

由于我可以使用openGL,所以我丢失了:

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

这基本上告诉我它将在 VBO 的开头呈现,如果我在那里有多个对象,这对我没有任何帮助。

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

4

3 回答 3

1

glDrawElements 不是从 VBO 的开头开始,而是从您指定要开始的指针的任何位置开始。

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

于 2012-11-01T21:50:45.660 回答
0

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

我最近在这里问了一个关于 glDrawElements 的问题。希望我发布的内容能提供一些解释/示例。

我理解它的方式:你的索引是由决定的,所以如果你想从第二个顶点开始,你可以尝试(一个基本的骨架,没有 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 是“索引”中元素的数量,GL_UNSIGNED_BYTE 是如何解释它们,“索引”只是数组的名称。

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

这有帮助吗?

于 2012-11-01T21:58:46.140 回答
0

你有几个选择。

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

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

于 2012-11-02T01:57:02.577 回答