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