如何在着色器中引用纹理?

时间:2015-12-23 09:30:29

标签: opengl graphics textures shader multitexturing

快速OpenGL新手问题。我在片段着色器中有这一行:

uniform sampler2D mytexture;

我深入研究了我使用的示例代码,但我找不到对mytexture的任何引用;只发现激活纹理单元的调用并将纹理绑定到之前复制到GPU的纹理。

我的问题是,片段着色器如何知道我使用的 only 纹理必须通过mytexture引用?

我原以为

glBindTextureToUniform(texture_id, "mytexture");
必须召唤

或类似的人。

2 个答案:

答案 0 :(得分:6)

映射在纹理单元和均匀之间,而不是纹理,如concept3d所提到的。造成这种差异的原因是多纹理。

纹理单元是OpenGL中用于促进多纹理化的机器。如果希望在着色器中查找多个纹理,则将每个纹理绑定到不同的纹理单元(实际上将其绑定到单元内的目标),并为每个纹理单元设置不同的制服以在着色器中引用它们。每个纹理单元都有多个目标,如1D,2D,3D等。

在着色器中查找的纹理,通过制服,指的是单位。其类型(例如sampler2D)决定使用的单位中的目标。这是映射的方式

uniform sampler2D mytexture;
            |         |
            |         |
            |         +--->GL_TEXTURE0 / UNIT 0      GL_TEXTURE1 / UNIT 1      GL_TEXTURE2 / UNIT 2
            |             +--------------------+    +--------------------+    +--------------------+
            |             |   +------------+   |    |   +------------+   |    |   +------------+   |
            |             |   | TEXTURE_1D |   |    |   | TEXTURE_1D |   |    |   | TEXTURE_1D |   |
            |             |   +------------+   |    |   +------------+   |    |   +------------+   |
            |             |   +------------+   |    |   +------------+   |    |   +------------+   |
            +---------------->| TEXTURE_2D |   |    |   | TEXTURE_2D |   |    |   | TEXTURE_2D |   |
                          |   +------------+   |    |   +------------+   |    |   +------------+   |
                          |   +------------+   |    |   +------------+   |    |   +------------+   | …
                          |   | TEXTURE_3D |   |    |   | TEXTURE_3D |   |    |   | TEXTURE_3D |   |
                          |   +------------+   |    |   +------------+   |    |   +------------+   |
                          |   +------------+   |    |   +------------+   |    |   +------------+   |
                          |   |TEX_1D_ARRAY|   |    |   |TEX_1D_ARRAY|   |    |   |TEX_1D_ARRAY|   |
                          |   +------------+   |    |   +------------+   |    |   +------------+   |
                          |         .          |    |         .          |    |         .          |
                          |         .          |    |         .          |    |         .          |
                          |         .          |    |         .          |    |         .          |
                          +--------------------+    +--------------------+    +--------------------+

您从图像或表格等上传纹理数据的目标(内部框)。如果未明确设置,活动单位默认为GL_TEXTURE0

  

片段着色器如何知道我使用的唯一纹理必须通过片段着色器中的mytexture引用?

最好使用单位ID设置制服。如果你没有,它仍然有效,那么你依赖于图形驱动程序的宽容行为。它可能不适用于所有设备甚至未来版本的驱动程序。我们将不得不查看规范。要知道是否允许这样做。

答案 1 :(得分:3)

OpenGL具有概念纹理单元,它们是从0 to MAX_TEXTURE_UNIT开始修复的。

  1. 首先,使用glActiveTexture(GL_TEXTURE0)
  2. 选择活动纹理单元
  3. 然后将纹理绑定到活动纹理单元。使用glBindTexture(GL_TEXTURE_2D, tex);
  4. 最后你设置着色器均匀值来引用纹理单元而不是纹理id ,它使用绑定到单元的任何纹理。
  5. 将纹理单元视为容器,统一变量使用纹理单元中的任何内容。

    换句话说,

    • 您将texture Id绑定到texture unit。不直接glBindTextureToUniform

    • 您将统一变量设置为纹理单位的值,它将引用绑定到它的任何纹理。