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(
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 级别的单个层 完整的纹理。
【讨论】:
当你为它分配内存或上传它glTexImage(2d)()时,GPU上的纹理不是吗?以上是关于OpenGL Bindless Texture 函数 glMakeTextureHandleNonResident 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
openGL之API学习(二零零)GL_TEXTURE_GEN_S GL_TEXTURE_GEN_T GL_TEXTURE_GEN_R GL_TEXTURE_GEN_Q