OpenGL VBO设置
我已经看到了很多关于减少对openGL调用的信息,但我对管道的理解还不够透彻。你能把VBO完全设置为时间头吗?具体地说,使用这种方法,它设置VBO,然后在调用绘图之前,每个帧调用启用/指针设置。创建VBO时,是否可以使用启用/指针设置完全设置VBO 像这样的OpenGL VBO设置,opengl,vbo,Opengl,Vbo,我已经看到了很多关于减少对openGL调用的信息,但我对管道的理解还不够透彻。你能把VBO完全设置为时间头吗?具体地说,使用这种方法,它设置VBO,然后在调用绘图之前,每个帧调用启用/指针设置。创建VBO时,是否可以使用启用/指针设置完全设置VBO 像这样的 Data_Init_Func(...) { .... glGenBuffers(1, &IndexVBOID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); g
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));
...
}
对
所有属性都不会启用和修改缓冲区对象本身。您不会告诉缓冲区对象它正在用于位置和法线。将缓冲区对象视为一个哑字节数组
gl*指针
调用告诉OpenGL如何解释该字节数组。它们没有连接到缓冲区。它们不会修改缓冲区。它们只是告诉OpenGL在特定缓冲区中的何处查找特定数据
如果要存储这些设置并在以后重置它们,需要先在init func中生成并绑定数组缓冲区,然后从那时起绑定的顶点或元素缓冲区将与数组缓冲区关联。完成后,取消绑定数组缓冲区。然后要使用数组缓冲区,自动设置指针,只需绑定数组缓冲区。
// DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE?