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

OpenGL VBO设置
EN

Stack Overflow用户
提问于 2012-04-09 23:35:27
回答 1查看 804关注 0票数 0

我看到了很多关于减少对openGL的调用的信息,但我对管道的了解还不够深入。你能把VBO完全设置在时间头上吗?特别是使用此example,它设置VBO,然后在绘制调用之前,每个帧调用启用/指针设置。VBO在创建时是否可以使用启用/指针设置进行完整设置?

像这样的东西

代码语言:javascript
复制
 Data_Init_Func(...)
 {
 ....

 glGenBuffers(1, &IndexVBOID);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
 short pindices[YYY];
 pindices[0]=0;
 pindices[1]=5;
 //etc...
 offsetInByte=0;
 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offsetInByte, SizeInBytes, pindices);

 glGenBuffers(1, VertexVBOID);
 glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
 glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);4

 //data creation and binding
 ...

 // Normally it seems like this code is PER FRAME... DOES IT NEED TO BE?
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_NORMAL_ARRAY); 
 glVertexPointer(3, GL_FLOAT, 64, BUFFER_OFFSET(0));
 glNormalPointer(GL_FLOAT, 64, BUFFER_OFFSET(12));
 glClientActiveTexture(GL_TEXTURE0);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call            
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(24));
 glClientActiveTexture(GL_TEXTURE1);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(32));
 glClientActiveTexture(GL_TEXTURE2);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);    //Notice that after we call
 glClientActiveTexture, we enable the array
 glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(40));
 ...
 }

 Draw(...)
 {
 glBindBuffer(GL_ARRAY_BUFFER_ARB, VertexVBOID);         // for vertex coordinates
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); // for indices

 // DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE?

 // draw 6 quads using offset of index array
 glDrawRangeElements(GL_TRIANGLES, x, y, z, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));

 ...
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-10 00:19:08

代码语言:javascript
复制
// DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE?

是。

所有属性都不启用,gl*Pointer调用会修改buffer对象本身。您不会告诉buffer对象它正用于位置和法线。把buffer对象看作是一个哑字节数组。

gl*Pointer调用告诉OpenGL如何解释字节数组。它们没有附加到缓冲区。它们不会修改缓冲区。它们只是告诉OpenGL在特定缓冲区中查找特定数据的位置。

如果要存储这些设置并在以后重置它们,则需要一个vertex array object

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

https://stackoverflow.com/questions/10075653

复制
相关文章

相似问题

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