opengl - 着色器中如何引用纹理?

标签 opengl graphics textures shader multitexturing

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

uniform sampler2D mytexture;

我查找了我正在使用的示例代码,但找不到任何对 mytexture 的引用;只找到激活纹理单元并将纹理绑定(bind)到之前复制到 GPU 的调用。

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

我本以为

glBindTextureToUniform(texture_id, "mytexture");

或者必须调用类似的方法。

最佳答案

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

纹理单元是 OpenGL 中促进多重纹理的机制。当您希望在着色器中查找多个纹理时,您可以将每个纹理绑定(bind)到不同的纹理单元(实际上您将其绑定(bind)到单元内的目标),并为每个纹理使用不同的制服以在着色器中引用它们。每个纹理单元有多个目标,如 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

how does the fragment shader know that the only texture I'm using has to be referred via mytexture in the fragment shader?

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

关于opengl - 着色器中如何引用纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432414/

相关文章:

c++ - 在 opengl 中混合固定功能管道和可编程管道

java - OpenGL-JOGL 颜色

graphics - 我应该为粒子引擎可编写脚本的引擎设计什么样的语言?

Java Swing Repaint 缓慢或无法工作

ios - 如何从 ARKit 应用程序更改对象的纹理?

c++ - OpenGL 中的纹理渲染

c++ - 将 Opengl 模型加载到容器中并依次调用它们

c - OpenGL - 如何让这个程序适用于大于 1x1 的纹理?

opengl - 3D游戏特效,火、闪电、水、冰

iphone - OpenGL ES (iPhone) 多重纹理 (2D) 代码