我正在与 Brad Larson 的 GPUImage 合作,我发现这真的很棒。为了灵 active 和易于编写,我创建了一个具有 3 个统一输入的自定义过滤器。我将其基于 GPUImageBrightnessFilter.h 和 .m。一个 uniform 只是一个“参数” float ,一个是“中心”CGPoint,如果我需要它们可以输入触摸坐标,还有一个是时间 float ,它是自着色器启动以来耗时量。我正在使用 initWithFragmentShaderFromFile
来使用我自己的着色器文件。
我的“参数”和“中心”制服有效。时间制服是行不通的,因为我不明白如何创造一个不断变化的制服(就像时间一样)。
我的时间统一的目标似乎与 SpriteKit 的 u_time
相似。它返回自当前着色器运行以来的秒数,您可以将其输入自定义着色器以对其进行动画处理。一个非常简单的示例用途可能是随着时间的推移循环图像的色调。随着我对 GLSL 知识的增长,我希望以更复杂的方式构建它。
我不确定要发布什么代码,因为我的误解可能存在于很多地方,而且可能是我正在尝试做一些不可能的事情。这篇关于设置开始时间并从 CACurrentMediaTime()
中减去它的帖子似乎是一个不错的起点:
Getting the time elapsed (Objective-c)
问题是我不确定如何不断更新制服以传递到我的着色器。我是否在我的自定义过滤器的 setter 中执行它有时间?自定义 setter 不是只执行一次吗?我是否在我的 init 覆盖中这样做?那不是只执行一次吗?我是否在我的 Controller 中编写了一个不断调用 setter 的循环?这似乎是一个昂贵且困惑的解决方案。
我不是要代码,只是建议引导我朝着正确的方向前进,或者让我远离我思考中的任何错误方向。
最佳答案
提出这个问题帮助我找到了解决方案并了解了 NSTimer。我将一个创建重复 NSTimer 的方法合并到我自定义的 GPUImageFilter 子类中,该子类将时间统一传递给着色器。它调用一个选择器来增加我的“时间”变量并将其传递到统一数组中。
关于ios - 为 GPUImage 创建耗时的制服,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34026511/