在iOS上,我发现大多数(所有?)设备的GL_MAX_VARYING_VECTORS都是8.我还读过(参见注释here)即使是混合操作也算作依赖纹理读取。总之,这些限制似乎意味着你不能拥有超过8个元素的卷积核心(至少不是最有效的元素)。
有没有办法在不产生依赖纹理读取的情况下评估超过8个元素的卷积核?
编辑:如果它有任何区别,我的内核是一个旋转的方块:
•
• • •
• • • • •
• • •
•
我目前的方法是创建两个版本的纹理 - 一个相对于另一个的偏移量(1,1) - 并使用此内核:
•
• • •
• • •
•
我不知道双倍数据流是否会超过避免依赖纹理读取的好处。正如@TraxNet建议的那样,我可能只需要测量它。
答案 0 :(得分:1)
这些限制似乎意味着你不能拥有超过8个元素的卷积核心(至少不是最有效的元素)。
我想你的意思是只有八个没有依赖读取的元素。您可以通过在片段着色器(依赖)中生成新的纹理坐标来查找纹理更多次。
根据查找的扩展程度,可以在纹理缓存中找到其中一些,这可能会降低某些性能损失。此外,这并不意味着如果您使用制服("常量")来替换纹理坐标,则着色器编译器无法优化此代码路径并在着色器执行之前显示纹理数据。但是,是的,你是正确的,如果没有9个不同的向量,你就无法在顶点着色器上实现3x3卷积。
最后你需要衡量和决定。