首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glMultiDrawElements VBO

glMultiDrawElements VBO
EN

Stack Overflow用户
提问于 2016-10-31 12:22:14
回答 1查看 526关注 0票数 1

我有一个模型我想用glMultiDrawElements渲染。准备数据并使用简单的向量进行呈现可以很好,但是当我使用顶点缓冲区时会失败。显然,在计算缓冲区偏移量时,我犯了某种错误。首先是工作守则:

作为第一步,我准备了以后使用的数据(包含伪代码以便于阅读):

代码语言:javascript
复制
for(each face in the model){
    const Face &f = *face;

    drawSizes.push_back(3);

    for(int i=0;i<f.numberVertices;++i){
        const Vertex &v = vertices[f.vertices[i]]]; // points to vertex array
    vertexArray.push_back(v.x);
    indexArray.push_back(vertexArray.size() - 1);
    vertexArray.push_back(v.y);
    indexArray.push_back(vertexArray.size() - 1);
    vertexArray.push_back(v.z);
    indexArray.push_back(vertexArray.size() - 1);

    normalArray.push_back(f.normalx);
    normalArray.push_back(f.normaly);
    normalArray.push_back(f.normalz);
    }
}

int counter = 0;

for(each face in the model){
    vertexIndexStart.push_back(&indexArray[counter*3]);
    offsetIndexArray.push_back(static_cast<void*>(0) + counter*3);
    counter++;
}

drawSizes is a vector<Glint>
vertexArray is a vector<GLfloat>
indexArray is a vector<GLint>
vertexIndexStart is a vector<Glvoid *>
offsetIndexArray is a vector<GLvoid *>

我现在用glMultiDrawElements-函数以下列方式绘制它:

代码语言:javascript
复制
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),&vertexArray[0]);
glNormalPointer(GL_FLOAT,0,&normalArray[0]);
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&vertexIndexStart[0],vertexIndexStart.size());
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

而且它所绘制的模型和它应该做的一样,尽管它的表现并不比即时模式好得多。

当我现在尝试缓冲所创建的数据并使用缓冲区呈现模型时,它显然不起作用。在第一步中,我再次对已经处理过的数据进行预处理:

代码语言:javascript
复制
glGenBuffers(2,buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertexArray),&vertexArray[0],GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexArray),&indexArray[0],GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

buffers is a GLuint[]

然后我尝试呈现数据:

代码语言:javascript
复制
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),0);
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&offsetIndexArray[0],vertexIndexStart.size());
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glDisableClientState(GL_VERTEX_ARRAY);

这导致了一个空屏幕。有什么想法吗?

编辑:我现在使用正确的索引,但我仍然没有得到想要的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-31 13:11:19

这是错误的:

代码语言:javascript
复制
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexIndexStart),&vertexIndexStart[0],GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

元素数组缓冲区应该包含索引数组,这意味着索引进入顶点数组,而不是索引数组。

还请注意,您的代码使用了许多不推荐的GL特性(内置属性,甚至可能是固定函数管道,在没有VAOs的情况下绘制),并且不会在现代OpenGL的核心配置文件中工作。

说到现代GL:在现代GL中,glMultiDrawElements本身的参数数组来自一个缓冲区对象,它甚至通过glMultiDrawElemetnsIndirect支持进一步的间接方向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40342111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档