张秋枫
关于GL_ARB_vertex_buffer_object扩展 |
GL_ARB_vertex_buffer_object,一般简称为VBO,这是OpenGL里的一个千呼万唤始出来的扩展,它可以根据实际情况决定把顶点数据放到显存、AGP内存或系统内存中。
其中:
目前只有DRAW有意义。 驱动程序会以usage为参考,根据多种条件决定是把数据放在显存、AGP内存还是系统内存中。比如如果还有足够的空余显存,usage指定为GL_STATIC_DRAW_ARB时,数据会被放在显存中,而如果空间不够,就会被放到AGP或系统内存中。
演示程序(vbo.zip,40.8KB) 程序是针对32M显存的,程序中一个buffer object大概占1M字节,如果是更大的显存,可以把MAX_BUFFER改大。 只要机器支持VBO,就尽量使用它,因为就算使用VBO在有些情况下(比如显存、AGP内存空间不够时,数据放在系统内存中)速度不会提升,也不会比原来的vertex array慢。而一旦数据放在显存、AGP内存中,性能将会得到很大的提升。偶试了下,在填充率不是瓶颈时,使用VBO比不使用VBO的帧数要快一倍。为index buffer专用 // 其它的vertex/normal/color等应该使用GL_ARRAY_BUFFER_ARB // Create index buffer object BindBufferARB(ELEMENT_ARRAY_BUFFER_ARB, 2); // 为buffer object分配空间,并把数据拷贝到新空间。 // 因为index是不变的,所以应该放到显存里面去,这里指定STATIC_DRAW_ARB,可能是显存 BufferDataARB(ELEMENT_ARRAY_BUFFER_ARB, 400, indexdata, STATIC_DRAW_ARB); // Free system memory buffer // 已经创建了buffer object,并把数据拷贝过去,所以indexdata没必要再存在 free(indexdata); // Frame rendering loop while (...) { |