OpenGL 无边界纹理函数 glMakeTextureHandleNonResident 究竟做了什么?

Joe*_*Joe 5 c++ opengl textures opengl-4

我有一个测试无绑定纹理的工作原型。我有一台可以平移超过 6 场纹理的相机,而我只有 2 场 VRAM。我有一个内部视锥体,用于获取视口中的对象列表以进行渲染,还有一个外部视锥体,用于将即将渲染的纹理和所有其他纹理(如果它们驻留)排队(驻留) , 使用函数 glMakeTextureHandleNonResident 将其设为非常驻。

程序运行,但 GPU 的 VRAM 表现得好像它有一个 GC 步骤,它以随机的时间间隔清除 VRAM。当它这样做时,我的渲染完全冻结,但随后跳到正确的帧,最终恢复到 60 FPS。我很好奇 glMakeTextureHandleNonResident 实际上并没有在“当”它被调用时从 VRAM 中拉出纹理。有谁确切地知道 GPU 正在通过该调用做什么?

GPU:英伟达 750GT M

And*_*man 3

无绑定纹理本质上是在硬件上公开一个转换表,以便您可以在着色器中使用任意整数(句柄)来引用纹理,而不是 GL 传统的绑定到图像单元机制;它们不允许您直接控制 GPU 内存驻留。

稀疏纹理实际上听起来更像你想要的。请注意,这两个东西可以一起使用。


使句柄成为非驻留句柄并不一定会从 VRAM 中逐出纹理内存,它只是从所述转换表中删除该句柄。纹理内存的驱逐可以推迟到将来的某个时间,正如您所发现的那样。

您可以在 的扩展规范中阅读有关此内容的更多信息GL_ARB_bindless_texture

void glMakeImageHandleResidentARB(GLuint64 句柄,GLenum 访问):

“当图像句柄驻留时,就 AreTexturesResident 命令而言,它引用的纹理不一定被视为驻留。”

问题:

(18)   纹理和图像句柄可以是驻留的或非常驻的。处理驻留如何与来自 OpenGL 1.1(glAreTexturesResidentGL_TEXTURE_RESIDENT)的纹理驻留查询交互?

解决

此扩展中纹理和图像句柄的驻留状态完全独立于 OpenGL 1.1 的GL_TEXTURE_RESIDENT 查询。纹理句柄的驻留取决于是否 glMakeTextureHandleResidentARB已为句柄调用。OpenGL 1.1 驻留通常取决于纹理数据是否驻留在 GPU 可访问的内存中。

当纹理句柄不常驻时,它所引用的纹理可能会也可能不会存储在 GPU 可访问的内存中。在这种情况下,查询 GL_TEXTURE_RESIDENT可能会返回。GL_TRUE但是,它并不能保证纹理句柄可以安全使用。

当纹理句柄驻留时,出于旧GL_TEXTURE_RESIDENT 查询的目的,它引用的纹理也被视为驻留。当图像句柄是驻留的时,它所引用的纹理可能会或可能不会被视为查询的驻留 - 驻留图像句柄可能仅引用完整纹理的单个 mipmap 级别的单个层。