OpenGL Bindless Texture 函数 glMakeTextureHandleNonResident 究竟做了啥?

Posted

技术标签:

【中文标题】OpenGL Bindless Texture 函数 glMakeTextureHandleNonResident 究竟做了啥?【英文标题】:What does OpenGL Bindless Texture function glMakeTextureHandleNonResident ACTUALLY do?OpenGL Bindless Texture 函数 glMakeTextureHandleNonResident 究竟做了什么? 【发布时间】:2015-02-07 00:21:12 【问题描述】:

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

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

GPU:英伟达 750GT M

【问题讨论】:

【参考方案1】:

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

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


使句柄非常驻并不一定会从 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 级别的单个层 完整的纹理。

【讨论】:

当你为它分配内存或上传它glTexImage(2d)()时,GPU上的纹理不是吗?

以上是关于OpenGL Bindless Texture 函数 glMakeTextureHandleNonResident 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL学习——纹理

openGL之API学习(二零零)GL_TEXTURE_GEN_S GL_TEXTURE_GEN_T GL_TEXTURE_GEN_R GL_TEXTURE_GEN_Q

<OpenGL> Texture Mapping

是否可以将 SDL_Texture 绘制到 OpenGL?

OpenGL入门之纹理Texture

openGL之API学习(二零三)GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T