【问题标题】:opengl reuse texture unitopengl 重用纹理单元
【发布时间】:2014-03-26 10:41:33
【问题描述】:

根据https://www.opengl.org/wiki/Texture,“如果两个不同的 GLSL 采样器具有不同的纹理类型,但与相同的纹理图像单元相关联,则渲染将失败。给每个采样器一个不同的纹理图像单元。”

但是 glactivetexture 使用枚举来迭代纹理单元。当我想重用单元时,如何确保纹理单元与正确的目标相关联。例如,首先将单元 2 用于 2D,然后再将其用于 3D。我试过 glBindTexture(GL_TEXTURE_1D/2D/3D, 0);但似乎不起作用。我应该使用 glenable 吗?

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    您误解了 OpenGL Wiki 上的这句话的含义。

    它指的是 GLSL 中的采样器制服。例如,sampler2DsamplerCube 引用相同的纹理图像单元是错误的。由于无法在编译/链接时确定这种情况,因此不会生成错误状态。相反,如果您尝试使用两种不同类型引用同一纹理图像单元的采样器,您将在着色器运行时创建未定义的行为。

    关于启用GL_TEXTURE_1D等。这是针对固定功能管道的。它在基于着色器的 OpenGL 中没有任何作用,纹理完全以编程方式有效地“启用”或“禁用”。如果您在着色器执行期间没有从某个纹理图像单元中采样任何内容,那么您可以将其视为“已禁用”。然而,最终这样的想法在可编程流水线中是无效的。你应该忘记那些状态曾经存在过。

    【讨论】:

    • 但是当我尝试使用 GL_TEXTURE_2D 和 GL_TEXTURE_3D 时指的是同一个纹理图像单元。我有两个着色器程序,一个着色器程序将使用 1D,另一个使用 3D。渲染将失败并显示黑屏。如果我使用两个不同的纹理单元,它将表现正确。我的程序是多线程的,一个着色器在 gui 线程中运行,另一个在另一个工作线程中运行。
    • 顺便说一下,我使用gDebugger调试它,发现相同的纹理单元可以绑定到2D和3D目标,但即使着色器程序只使用2D,它也无法获得正确的值。
    • 您是否有多个上下文才能进行这种多线程渲染? OpenGL 存储每个上下文的纹理绑定,纹理名称(句柄)可以在上下文之间共享,但底层状态机(包括哪些纹理绑定到什么)不能。
    • 是的,我有多个上下文,并使用共享上下文来共享这些纹理
    • 您是否期望在一个上下文中绑定的纹理在另一个上下文中绑定?您不能在另一个上下文中依赖一个上下文中的状态机。所以这意味着如果你将纹理绑定到GL_TEXTURE0,例如,在线程A中,然后尝试在线程B中使用GL_TEXTURE0绘制一些东西,线程B将不知道你在线程A中绑定了什么。它们有单独的状态机。
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多