【问题标题】: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

【问题讨论】:

    标签: c++ opengl textures opengl-4


    【解决方案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上的纹理不是吗?
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多