GL_TRIANGLE_STRIP的glDrawRangeElements无法正常工作(使用glMapBuffer)

时间:2014-04-20 15:46:21

标签: c++ opengl

我正在尝试使用glDrawRangeElements从VBO和元素缓冲区对象渲染点。

VBO和EBO就像这样实现:

    glGenBuffers(1, &vertex_buffer);
    glGenBuffers(1, &index_buffer);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, NULL, GL_STREAM_DRAW);
    glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (char*)(NULL));
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, NULL, GL_STREAM_DRAW);

你可以看到他们没有任何"静态"数据。

我使用glMapBuffer填充缓冲区,然后用glDrawRangeElements渲染它们。

问题:

具体而言,我想做的是用连续LOD制作地形。 我使用和发布的代码主要来自Andras Balogh的Ranger Mk2。

我的问题是这样的:当我想要渲染三角形条带时,三角形的3个点上似乎有一个点,它不应该在某个地方。 例如, 这是我在线框模式下获得的 - > http://i.stack.imgur.com/lCPqR.jpg

这就是我在点模式下得到的(注意伸展的列,这是不正确放置的点) - > http://i.stack.imgur.com/CF04p.jpg

在你让我去找一个名为&#34的帖子之前;用glDrawRangeElements()渲染不正常",我想告诉你我已经去过那里了。

代码:

所以这是渲染过程:

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(4, GL_FLOAT, 0, 0);
glEnableVertexAttribArray(0);

glDrawRangeElements(GL_TRIANGLE_STRIP, 0, va_index, ia_index, GL_UNSIGNED_INT,  BUFFER_OFFSET(0));

glDisableClientState(GL_VERTEX_ARRAY);

就在我这样做之前(pre_render函数):

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);

vertex_array = (v4f*)(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
index_array  = (u32*)(glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY));

//[...] Populate the buffers

glUnmapBuffer(GL_ARRAY_BUFFER);
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);

PS:当我像这样渲染地形时:

glBegin(GL_TRIANGLE_STRIP);
printf("%u %u\n", va_index, ia_index);
for(u32 i = 0; i < va_index; ++i){
    //if(i <= va_index)
        glVertex4fv(&vertex_array[i].x);
}
glEnd();

奇怪的是它有效(部分三角形虽然没有渲染,但这是另一个问题)。

所以我的问题是如何让glDrawRangeElements正常运行?

如果您需要更多信息,请询问,我很乐意回答。

编辑:我使用Qt Creator作为IDE,在Windows 7上使用Mingw 4.8。我的图形卡支持Opengl 4.4(来自Nvidia)。

1 个答案:

答案 0 :(得分:3)

不确定这是否会导致您的问题,但我注意到您对内置顶点属性和通用顶点属性的API调用混合。

glVertexAttribPointerglEnableVertexAttribArrayglDisableVertexAttribArray等通话用于通用顶点属性。

glVertexPointerglEnableClientStateglDisableClientState等通话用于内置顶点属性。

您需要决定要使用哪种方法,然后对该方法使用一组一致的API调用。如果使用固定渲染管道,则需要使用内置属性。如果您使用兼容性配置文件编写自己的着色器,则可以使用其中任何一个。如果使用核心配置文件,则需要使用通用顶点属性。

此调用看起来也很可疑,因为它指定的大小为3,其余代码表明您使用的是4个坐标的位置:

glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (char*)(NULL));