我的显卡是GTX 1080 ti。我想使用OpenGL 3D纹理。像素(体素(格式为GL_R32F。OpenGL在初始化纹理并使用纹理渲染时没有报告任何错误。
当3D纹理很小(512x512x512(时,我的程序运行得很快(约500FPS(。
然而,如果我将大小增加到1024x1024x1024(4GB(,则FPS会急剧下降到1FPS以下。当我监测GPU内存使用情况时,GPU内存不会超过3GB,即使纹理大小是4GB,我总共有11G。
如果我将像素格式更改为GL_R16F,它再次工作,FPS恢复到500FPS,GPU内存消耗约为6.2GB。
我的假设是4GB的3D纹理不是真的在GPU上,而是在CPU内存上。在每一帧中,驱动程序都会一次又一次地将这些数据从CPU内存传递到GPU内存。因此,它降低了性能。
我的第一个问题是我的假设是否正确?如果是,为什么即使我有足够的GPU内存也会发生这种情况?如何强制任何OpenGL数据驻留在GPU内存上?
我的第一个问题是我的假设是否正确?
至少这不是不合理的。
如果是,为什么即使我有足够的GPU内存也会发生这种情况?
这是OpenGL实现的决定。请注意,这也可能是一些驱动程序错误。这也可能是一些内部限制。
如何强制任何OpenGL数据驻留在GPU内存上?
你不能。OpenGL没有视频RAM或系统RAM的概念,甚至没有GPU。指定缓冲区、纹理和其他对象并进行绘制调用,GL实现的工作是将其映射到实际硬件。然而,没有任何性能保证——当你做某些事情时,你可能会遇到一个缓慢的路径,甚至是软件渲染的回退(后者在最近很少见,但从概念上讲,这是非常可能的(。
如果您想控制数据的放置位置、实际传输时间等等,您必须使用更低级的API,如Vulkan。