能否采用第一种方式创建OpenGL中的PBO?
能否用普通缓冲区的创建方式生成PBO?
完全可以。
PBO本身就是普通的OpenGL缓冲区对象,它和其他缓冲区的唯一区别,只是被绑定到了GL_PIXEL_UNPACK_BUFFER或GL_PIXEL_PACK_BUFFER这类像素数据相关的目标上,用来优化像素数据的传输操作。
你给出的第一种方式是现代OpenGL的**直接状态访问(DSA)**风格API,不需要先把缓冲区绑定到目标就能直接初始化存储。之后只要把这个缓冲区绑定到像素相关目标,它就可以作为PBO使用,示例代码如下:
GLuint pbo; glCreateBuffers(1, &pbo); // 直接初始化PBO的存储,无需提前绑定到像素目标 glNamedBufferStorage(pbo, size, pixelData, flags); // 需要使用PBO时,绑定到对应的像素目标即可 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
而第二种方式是传统的“绑定-操作”模式,先创建缓冲区,绑定到像素目标后再用glBufferData初始化。两种方式本质没有区别,只是API风格不同——DSA方式更灵活,不会修改当前上下文绑定的缓冲区状态。
总结来说:只要是合法创建的OpenGL缓冲区对象,只要绑定到像素相关的目标,就可以作为PBO使用,不管你是用DSA风格的glNamedBufferStorage还是传统的glBufferData来初始化它。
内容的提问来源于stack exchange,提问作者SZYoo
相关产品推荐
相关产品推荐

