【问题标题】:OpenGL glActiveTexture vs glBindImageTextureOpenGL glActiveTexture 与 glBindImageTexture
【发布时间】:2016-03-01 06:40:09
【问题描述】:

我是 OpenGL 的新手,我对这些函数感到困惑。 我认为 glActiveTexture 会激活纹理“插槽”或​​类似的东西, 并且您绑定的下一个纹理将绑定到此插槽。 但是现在看到glBindImageTexture(调用:glBindImageTexture(0, texHandle, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);),看不出这个函数和glActiveTexture、glTexImage2D有什么区别。

其实我什至不知道纹理和图像之间的区别,所以你能解释一下区别吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    glActiveTextureglBindImageTexture 彼此无关。尽管它们的命名相似,但它们代表两种完全不同的事物。

    glActiveTexture 设置当前活动的“纹理图像单元”。

    glBindImageTexture 将图像从纹理绑定到特定的“图像单元”。注意引文中的关键短语。 “图像单位”用于着色器image load/store operations。它们用于shader sampler accesses;这是为“纹理图像单元”保留的。是的,它们的名称相似,但它们不是一回事。

    图像加载/存储用于从着色器中任意读取和(主要)写入图像数据。在 GLSL 中,这些由带有前缀 imageuniform 变量定义(例如,image2D)。常规纹理访问由前缀为 sampler 的统一变量处理(如 sampler2D)。

    采样器纹理访问允许您执行 filtering、自动 mipmap 选择等操作。图像加载/存储没有。它只是从特定纹理中的特定图像中读取内存。

    要将纹理与采样器一起使用,请将纹理绑定到纹理图像单元(通常使用 glActiveTexture/glBindTexture)。要使用带有图像加载/存储的纹理中的图像,请使用glBindImageTexture。纹理图像单元集与“图像单元”集没有任何关系。

    这两个函数都没有替代另一个函数,它们也没有任何冲突。 “图像单元”的数量与“纹理图像单元”的数量无关。并且当前的“纹理图像单元”对glBindImageTexture 没有影响。或与“图像单元”有关的任何其他内容。

    【讨论】:

    • 因此,虽然采样器提供了特殊功能,如过滤(线性、最近、mipmapping),但图像提供了对绑定图像的原始读/写接口。对吗?
    【解决方案2】:

    将纹理单元(glActiveTexture 选择的)视为墨盒的插槽。而 glBindTexture 实际上将墨盒插入到 glActiveTexture 选择的插槽中。

    glTexImage2D 是将“绘画”加载到实际墨盒中的内容。支持多重纹理的 GPU(所有现代 GPU 都支持多重纹理)可以同时使用多个填充不同图像(使用 glTexImage)的墨盒(纹理),其中每个墨盒都设置在一个纹理单元中。一件有趣的事情是,同一个墨盒可以同时插入多个单元。

    因评论而更新

    在非常粗略的意义上,您可能会认为图像数据以这种方式流动。

    【讨论】:

    • 好的,但是这些“图像”是什么或者它们与常规纹理有何不同?以及上面提到的功能性 glBindImageTexture 怎么样?
    • @Jim:我添加了一个图表,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多