如何将可变长度浮点数组传递给GPUImageFilter着色器?

时间:2014-12-23 04:16:19

标签: arrays variables gpuimage

我想将我的触摸点传递给GPUImage(iOS) Point可以转换为float数组,数组的长度是可变长度。 但我必须在着色器中指出数组的长度。

1 个答案:

答案 0 :(得分:1)

免责声明:不是glsl专家

AFAIk你不能拥有你想要的可变长度数组。这是一个GLSL限制,而不是GPUImage所以它不是一个快速修复 - 你将要做的工作将是纹理或glsl,而不是GPUImage。

这是关于glsl:GLSL indexing into uniform array with variable length

的另一个堆栈溢出帖子

有两种解决方案可行:

1)限制点数。限制接触是合理的,但实际上如果太多则可能很难缩小范围。您可以将这些点传递给固定长度的数组或作为单个常量(每个点一个)。如果你真的关心点数的可扩展性,这不是一个好方法,因为在你的着色器中你必须检查每个点并执行相关的计算,这对于整个图像执行时可能很昂贵(再次,取决于您的用例)。如果对于每个像素,您要检查距离点,这可能太昂贵了。

2)在纹理中输入你的点数。您可以使用带有x& y坐标的2个1D纹理,然后将它们视为数组(然后转到选项1),或者您可以创建2D纹理,全部为0,并将部分设置为1,其中有触摸。 2D纹理可以具有比实际屏幕更低的分辨率。如果您正在做一些简单的操作,例如将手指触摸为黑色,则此方法对着色器的工作量可能要少得多。

您的选择很大程度上取决于您使用着色器中的点进行的操作。