opengl映射的数组缓冲区总是太小

时间:2014-04-08 20:59:45

标签: arrays opengl

我在opengl应用程序中使用顶点数组对象。当我测试它的少量顶点时,映射数组缓冲区没有问题。然后我尝试分配一个更大的缓冲区:

    unsigned int vaoToStore, vboToStore[2];
    glGenVertexArrays ( 1, &vaoToStore );
    glBindVertexArray ( vaoToStore );

    glGenBuffers ( 2, vboToStore );
    glBindBuffer ( GL_ARRAY_BUFFER, vboToStore[0] );

    glBufferData ( GL_ARRAY_BUFFER,
                   30000,
                   NULL,
                   GL_DYNAMIC_DRAW );

    glEnableVertexAttribArray ( kAttribPositionLoc );
    glEnableVertexAttribArray ( kAttribColorLoc );
    glEnableVertexAttribArray ( kAttribTexcoordLoc );
    glEnableVertexAttribArray ( kAttribMaskIndex );

    glVertexAttribPointer ( kAttribPositionLoc, 3, GL_FLOAT, GL_FALSE, 10 * sizeof ( float ), 0 );
    glVertexAttribPointer ( kAttribColorLoc, 4, GL_FLOAT, GL_FALSE, 10 * sizeof ( float ), ( void* ) ( 3*sizeof ( float ) ) );
    glVertexAttribPointer ( kAttribTexcoordLoc, 2, GL_FLOAT, GL_FALSE, 10 * sizeof ( float ), ( void* ) ( 7*sizeof ( float ) ) );
    glVertexAttribPointer ( kAttribMaskIndex, 1, GL_FLOAT, GL_FALSE, 10 * sizeof ( float ), ( void* ) ( 9*sizeof ( float ) ) );

    glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER, vboToStore[1] );

    glBufferData ( GL_ELEMENT_ARRAY_BUFFER,
                   1000 * sizeof ( unsigned int ),
                   NULL,
                   GL_DYNAMIC_DRAW );

然后使用glMapBufferRange进行映射时,元素数组可以正常工作,但属性数组总是返回null,除非我只映射100或更小的大小... 这是正常的行为吗?我搜索谷歌和opengl引用,但他们似乎都暗示它应该是可能的。

按要求映射代码

float *vertAttribs = reinterpret_cast<float*> ( glMapBufferRange( GL_ARRAY_BUFFER, 0, 30000, GL_MAP_WRITE_BIT ) );

    unsigned int *elements = reinterpret_cast<unsigned int*> ( glMapBufferRange ( GL_ELEMENT_ARRAY_BUFFER, 0, 1000 * sizeof ( unsigned int ), GL_MAP_WRITE_BIT ) );

现在,正如我所说,映射像这样的元素缓冲区有效,而即使我将大小从30000更改为(sizeof(float)* 1000),属性数组也会在映射上抛出INVALID_VALUE ...

1 个答案:

答案 0 :(得分:0)

行!!弄清楚:我不知道GL_ARRAY_BUFFER绑定不是VAO状态的一部分......所以我绑定了VAO并认为它也意味着绑定了数组缓冲区。 Noob错误我相信,这解释了为什么其他VAO的显示全部搞砸了,而且它也更小,这解释了有限的映射范围。