Opengl 绘制每帧生成的图像?

Opengl 绘制每帧生成的图像?,opengl,Opengl,我有一个纹理,每一帧都会生成,我想知道在opengl中渲染它的最佳方式。它只是在cpu上以rgba8(32位,每个组件8位)格式生成的像素数据,我只需要将其传输到gpu并将其绘制到屏幕上。我记得有某种像素缓冲区或帧缓冲区可以做到这一点,而不必在与GLTEXAGE2D关联的每一帧生成新纹理?像素缓冲区对象不会改变这样一个事实,即您需要调用GLTEXAGE2D(…)来(重新)分配纹理存储并复制图像。PBO提供了一种异步像素传输的方法-基本上使调用glTexImage2D(…)不必阻塞,直到它完成将内

我有一个纹理,每一帧都会生成,我想知道在opengl中渲染它的最佳方式。它只是在cpu上以rgba8(32位,每个组件8位)格式生成的像素数据,我只需要将其传输到gpu并将其绘制到屏幕上。我记得有某种像素缓冲区或帧缓冲区可以做到这一点,而不必在与GLTEXAGE2D关联的每一帧生成新纹理?

像素缓冲区对象不会改变这样一个事实,即您需要调用
GLTEXAGE2D(…)
来(重新)分配纹理存储并复制图像。PBO提供了一种异步像素传输的方法-基本上使调用
glTexImage2D(…)
不必阻塞,直到它完成将内存从客户端(CPU)复制到服务器(GPU)


对于您来说,唯一能够真正提高性能的方法是,在CPU上计算图像时,将内存映射到PBO(像素解包缓冲区)中,并在每一帧写入映射的内存

当该缓冲区绑定到
GL\u PIXEL\u UNPACK\u buffer
时,调用
glTexImage2D(…)
withNULL以获取
数据
参数,这将使用服务器已拥有的内存上载纹理,从而避免立即进行客户端->服务器复制。通过这样做,您可能会在性能上获得微小的改进,但不要期望有任何巨大的改进。这取决于在映射/取消映射缓冲区内存和将缓冲区上载到纹理并使用所述纹理之间所做的工作

此外,如果您调用
glTexSubImage2D(…)
每一帧,而不是通过调用
glTexImage2D(…)
来分配新的纹理图像存储(不要担心,当不再有挂起的命令使用旧存储时,旧存储会被回收),您可能会引入新的同步开销源,从而降低性能。你在这里要找的东西被称为

使用无需转换的像素格式更有可能提高性能。较新版本的GL(4.2+)允许您使用查询最佳像素传输格式



最后一点,主要是迂腐的注释,
glTexImage2D(…)
不会生成纹理。它为它们的图像分配存储空间,并可以选择传输像素数据。纹理对象(通常是OpenGL对象)实际上是在第一次绑定时生成的(例如,
glBindTexture(…)
)。从那时起,
glTexImage2D(…)
仅管理属于所述纹理对象的内存。

像素缓冲区对象不会改变您需要调用
glTexImage2D(…)
以(重新)分配纹理存储并复制图像的事实。PBO提供了一种异步像素传输的方法-基本上使调用
glTexImage2D(…)
不必阻塞,直到它完成将内存从客户端(CPU)复制到服务器(GPU)


对于您来说,唯一能够真正提高性能的方法是,在CPU上计算图像时,将内存映射到PBO(像素解包缓冲区)中,并在每一帧写入映射的内存

当该缓冲区绑定到
GL\u PIXEL\u UNPACK\u buffer
时,调用
glTexImage2D(…)
withNULL以获取
数据
参数,这将使用服务器已拥有的内存上载纹理,从而避免立即进行客户端->服务器复制。通过这样做,您可能会在性能上获得微小的改进,但不要期望有任何巨大的改进。这取决于在映射/取消映射缓冲区内存和将缓冲区上载到纹理并使用所述纹理之间所做的工作

此外,如果您调用
glTexSubImage2D(…)
每一帧,而不是通过调用
glTexImage2D(…)
来分配新的纹理图像存储(不要担心,当不再有挂起的命令使用旧存储时,旧存储会被回收),您可能会引入新的同步开销源,从而降低性能。你在这里要找的东西被称为

使用无需转换的像素格式更有可能提高性能。较新版本的GL(4.2+)允许您使用查询最佳像素传输格式



最后一点,主要是迂腐的注释,
glTexImage2D(…)
不会生成纹理。它为它们的图像分配存储空间,并可以选择传输像素数据。纹理对象(通常是OpenGL对象)实际上是在第一次绑定时生成的(例如,
glBindTexture(…)
)。从那时起,
glTexImage2D(…)
仅管理属于所述纹理对象的内存。

像素缓冲区对象不会改变您需要调用
glTexImage2D(…)
以(重新)分配纹理存储并复制图像的事实。PBO提供了一种异步像素传输的方法-基本上使调用
glTexImage2D(…)
不必阻塞,直到它完成将内存从客户端(CPU)复制到服务器(GPU)


对于您来说,唯一能够真正提高性能的方法是,在CPU上计算图像时,将内存映射到PBO(像素解包缓冲区)中,并在每一帧写入映射的内存

当该缓冲区绑定到
GL\u PIXEL\u UNPACK\u buffer
时,调用
glTexImage2D(…)
withNULL以获取
数据
参数,这将使用服务器已拥有的内存上载纹理,从而避免立即进行客户端->服务器复制。你的表现可能会有轻微的提高