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