3

在 iOS 上,我发现大多数(所有?)设备的 GL_MAX_VARYING_VECTORS 为 8。我还阅读过(请参阅此处的注释),即使 swizzle 操作也算作依赖纹理读取。总之,这些限制似乎意味着你不能拥有超过八个元素的卷积核(至少,不是一个最有效的)。

有没有一种方法可以评估超过 8 个元素的卷积核,而不会产生相关的纹理读取?

编辑:如果有什么不同,我的内核是一个旋转的正方形:

    •
  • • •
• • • • •
  • • •
    •

我目前的策略是创建两个版本的纹理——一个相对于另一个偏移 (1, 1)——并使用这个内核:

  •
• • •
  • • •
    •

我不知道加倍的数据流是否会超过避免依赖纹理读取的好处。正如@TraxNet 建议的那样,我可能只需要测量它。

4

1 回答 1

1

总之,这些限制似乎意味着你不能拥有超过八个元素的卷积核(至少,不是一个最有效的)。

我想你的意思是只有八个元素没有依赖读取。您可以通过在片段着色器(依赖)处生成新的纹理坐标来多次查找纹理。

根据查找的分布范围,其中一些可以在纹理缓存中找到,这可能会减轻一些性能损失。此外,这并不意味着如果您使用统一(“常量”)来替换纹理坐标,着色器编译器将无法优化此代码路径并在着色器执行之前带来纹理数据。但是,是的,你是对的,如果没有 9 个不同的向量,你就无法在顶点着色器上实现 3x3 卷积。

最后你需要衡量和决定。

于 2013-05-04T22:13:56.630 回答