2012-11-01 140 views
0

我有点困惑,当涉及到什么函数我应该用于我的OpenGL延期渲染。OpenGL渲染问题与glDrawElement

我有VBO的(顶点缓冲对象)

每一个代表一种类型顶点的这样的一个可能被(位置+彩色)

我也有一个用于的indeces

列表我的问题是当我想要呈现不同的对象

IM使用到了DirectX方式,你 1)激活你的顶点缓冲 2)激活您的索引缓存 3)那么你指定你的绘图调用你的原始类型 从顶点缓冲区开始顶点,最小顶点索引,顶点数,开始指数和原始值计数

与openGL im丢失,因为我可以使用:

glDrawElements - 但这使用渲染模式,对象计数,该指数之字节型和指数

这基本上只是告诉我,它会呈现在VBO开始它不会帮助我任何,如果我有多个那里有物体。

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

回答

0

你有几个选择。

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

后者应该在仍支持的任何非Intel硬件上可用。

+0

是的,我正在与glDrawElementsBaseVertex四处张望。在我看来,最简洁的方式就是不用翻录大量渲染组件 –

1

glDrawElements从VBO开始启动,而是来自无论你指定的指针开始。

如果你有一个VBO,你要开始它的下半年渲染,然后设置字节偏移从作为glVertexAttribPointer的最后一个属性开始。

+0

所以为了使用glDrawElements我必须在它之前使用glVertexAttribPointer吗? –

+0

是的,你必须总是有一个指针(或几个)设置为使用glDrawElements(假设你没有使用不赞成使用的'即时模式'(glBegin/End等))指针告诉glDrawElements从哪里获取数据 – Tim

+0

我一直认为,当我使用glVertexAttribPointer它是告诉它如何拆分我的顶点,而不是从我的vbo开始呈现的位置 –

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张是“指数”的内部元素的数量,GL_UNSIGNED_BYTE是如何解释他们,“指数”是数组的只是名字。

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

这有帮助吗?

+0

我明白你在说什么,但是我想要控制的是指数将被加载,好像在说“模型1使用指数1,2,3,4”,但随后加载“模型2,使用自己的指数加载为1,2,3,4”,现在你有2模型完全在同一个vbo中,当我尝试为模型2使用glDrawElements时,ibo和glDrawElements将最终呈现模型1. –

+0

啊,所以在不同的绘制调用之间保持相同的索引,但是将VBO中的数据替换为新的模型?有道理,蒂姆说,你说的是正确的将使用glVertexAttribPointer并指向VBO中的新位置,同时使GlDrawElements调用保持不变。 (除非我完全错过了你的观点,在这种情况下,我很抱歉。) – Hydronium

+0

是的第二部分似乎是正确的。即时通讯将找到一种方法,使glVertexAttribPointer调用健壮,并应该可以解决这个问题 –