我有一个可以测试无边框纹理的工作原型。我有一台摄像机,可以播放超过6演出的纹理,而我只有2演出的VRAM。我有一个内截头体,用于获取视口中用于渲染的对象列表,以及一个外截头体用于队列(驻留)即将渲染的纹理,所有其他纹理,如果它们是居民,使用函数glMakeTextureHandleNonResident进行非常驻。
程序运行,但是gpu的VRAM表现得好像它有一个GC步骤,它以随机的时间间隔清除VRAM。当它这样做时,我的渲染完全冻结,但随后跳到正确的帧,最终回到60 FPS。我很好奇glMakeTextureHandleNonResident实际上并没有在“调用”时将纹理拉出VRAM。有没有人确切知道GPU正在通过该呼叫做什么?
GPU:Nvidia 750GT M
答案 0 :(得分:2)
Bindless纹理基本上会在硬件上显示转换表,以便您可以在着色器中使用任意整数(句柄)来引用纹理,而不是GL的传统绑定到图像单元机制;它们不允许您直接控制GPU内存驻留。
Sparse textures实际上听起来更像你想要的。请注意,这两件事可以一起使用。
使句柄非驻留不一定从VRAM中驱逐纹理内存,它只是从所述转换表中删除句柄。纹理记忆的驱逐可以推迟到将来的某个时间,正如您所发现的那样。
您可以在GL_ARB_bindless_texture
的扩展程序规范中详细了解这一点。
“当图像句柄驻留时,它引用的纹理不一定被认为是AreTexturesResident命令的驻留。”
(18)纹理和图像处理可以是驻留的或非驻留的。怎么样 处理驻留与纹理驻留查询交互 OpenGL 1.1(
glAreTexturesResident
或GL_TEXTURE_RESIDENT
)?<强>分辨强>:
纹理和图像处理的驻留状态 扩展完全独立于OpenGL 1.1的
GL_TEXTURE_RESIDENT
查询。纹理手柄的驻留是否是一个函数 已经调用glMakeTextureHandleResidentARB
来处理句柄。 OpenGL 1.1 驻留性通常是纹理数据是否的函数 驻留在GPU可访问的内存中。当纹理句柄没有驻留时,它引用的纹理 可能会也可能不会存储在GPU可访问的内存中 。该 在这种情况下,
GL_TEXTURE_RESIDENT
查询可能会返回GL_TRUE
。但是,确实如此 不保证纹理手柄可以安全使用。当纹理句柄驻留时,它引用的纹理是 也被认为是旧的
GL_TEXTURE_RESIDENT
居民 查询。当图像句柄驻留时,它所引用的纹理 可能会或可能不会被视为查询的居民 - 居民 图像句柄可能仅指单个mipmap级别的单个图层 完整的纹理。