当谈到我应该用于OpenGL Deferred Rendering的函数时,我有点困惑。
我有一个VBO(顶点缓冲对象)列表
每一个都代表一种顶点类型,一个可能是(位置+颜色)
我还有一个用于indeces
当我想要渲染不同的对象时,我的问题出现了
即时使用你所在的directX方式 1)激活你的顶点缓冲区 2)激活索引缓冲区 3)然后在绘图调用中指定原始类型 顶点缓冲区的起始顶点,最小顶点索引,顶点计数,起始指标和原始计数
因为我可以使用openGL而丢失了:
glDrawElements - 但它使用渲染模式,对象计数,indice字节类型和索引
这基本上告诉我它将在VBO的开头呈现,如果我有多个对象,它将无法帮助我。
任何人都知道openGL具有哪些渲染功能,我可以指定VBO中从哪里开始渲染并指定我的起始顶点位置?我希望有人有任何想法= \
答案 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,在这里您可以指定一个顶点索引,该索引将所有索引的索引添加到。
后者应该可以在任何仍然支持的非英特尔硬件上使用。