You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

glTexImage2D/glTexSubImage2D是否会使无绑定纹理句柄失效?

无绑定纹理句柄在纹理修改后的有效性问题

OpenGL规范的明确规则

  • 仅更新像素数据的操作(如glTexSubImage2D、glCompressedTexSubImage2D):这类操作不会改变纹理对象的核心标识,原有的纹理句柄完全有效,不需要重新调用glGetTextureHandleARB或glMakeTextureHandleResidentARB。句柄关联的是纹理对象本身,像素内容的更新属于对象内部状态变更,不影响句柄的绑定关系。
  • 修改纹理存储参数的操作(如glTexImage2D修改宽高、格式、样本数等):这类操作会彻底重建纹理的存储资源,相当于重置了纹理对象的核心属性,此时原有的纹理句柄会直接失效。必须重新调用glGetTextureHandleARB获取新句柄,再执行glMakeTextureHandleResidentARB使其驻留后,才能再次传入着色器使用。

各厂商驱动的实际表现

  • NVIDIA驱动:
    • 对于glTexSubImage2D类操作,和规范一致,句柄完全可用;
    • 早期部分版本驱动对glTexImage2D修改存储参数的情况,可能允许旧句柄继续工作,但这属于厂商的兼容优化,并非规范要求,新版本驱动已逐步修正为严格遵循规范,不能依赖该行为。
  • AMD驱动:严格遵循规范,glTexSubImage2D句柄正常;glTexImage2D修改存储参数后,旧句柄立即失效,继续使用会触发GL错误或渲染异常。
  • Intel驱动:行为与AMD完全一致,严格执行规范,修改存储参数后旧句柄失效,必须重新获取并驻留。

实践建议

  • 如果仅更新纹理像素数据:无需对句柄做任何额外操作,直接复用原有句柄即可,跨厂商驱动都能兼容。
  • 如果需要修改纹理的宽高、格式等存储参数:务必先调用glMakeTextureHandleNonResidentARB标记旧句柄非驻留,然后重新执行glGetTextureHandleARB和glMakeTextureHandleResidentARB,再将新句柄传入着色器。
  • 不要依赖NVIDIA的非规范兼容行为,严格按照OpenGL规范执行,才能保证跨平台、跨驱动的稳定性。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:03:18