【问题标题】:Variable number of texture units in a shader in OpenGL ES 2.0 on iOSiOS 上 OpenGL ES 2.0 中着色器中可变数量的纹理单元
【发布时间】:2012-06-25 10:15:57
【问题描述】:

我有 N 个需要从片段着色器同时访问的纹理单元。 N 随加载的数据而变化。所以,在着色器中,我需要这样的东西:

// illegal syntax?
uniform sampler2D tex[N];

此外,OpenGL ES 2.0 似乎不支持 sampler2DArray。

只是想知道是否有任何其他技巧或 GLSL 预处理器构造可以用来实现上述目标。

或者,动态生成着色器代码是更好的选择吗?我可以生成类似下面的代码,然后加载着色器:

uniform sampler2D tex1;
...
uniform sampler2D texN;

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    您可以尝试定义一个恒定的最大采样器数量,并在运行时接收实际大小。

    uniform sampler2D tex[MAX_VALUE];
    uniform int size;
    int main(){
        ....
    }
    

    【讨论】:

    • MAX_VALUE 的类型是什么?它在哪里设置?我不认为以上是合法的语法。
    • MAX_VALUE 作为常数 (16 , 32, 64)
    • 这行不通,因为 N 取决于数据,就像我说的那样。为此,我需要动态生成着色器。此外,ES 2.0 是否支持统一的 sampler2D 数组?我对此表示怀疑。
    【解决方案2】:

    您需要显式设置数组的大小吗?据我了解,您可以使用以下命令指定任意大小的 sampler2D 的统一数组:

    uniform sampler2D tex[];
    

    我认为这通常会按照您的意愿工作,但无需明确设置大小。我正在使用这种方法,但目前仅向数组提供一个纹理,并稍后在代码中使用其数组索引 tex[0] 引用它。还没有构建到我准备好在其中放置超过 1 个纹理的地步,所以我不是 100% 的。

    我对 OpenGL 很陌生,所以定义数组的大小可能有一些好处,我不知道。

    【讨论】:

    • 我认为这不适用于超过 1 个纹理。这是在 OpenGL ES 2.0 上吗?
    • 我认为你是对的,我是在误读非 ES 规范后写的。
    • 虽然似乎支持纹理数组本身,但示例 6_3 中的 Learning OpenGL ES for iOS 一书演示了使用语法 uniform sampler2D u_unit2d[MAX_TEXTURES]; 其中 #define MAX_TEXTURES 2 定义在着色器顶部,所以它仍然不是一个变量。 Brad Larson 在他的 GPUImage 库中调整了 GLProgram 以支持从 NSString 加载着色器,这可能有助于动态构建着色器。
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多