在开发 iOS API 时,我编写了几个对于 API 非常重要的着色器。这些着色器采用 vsh 和 fsh 文件的形式。现在,在使用 API 处理实际项目时,我发现当我们将包含 API 源的文件夹添加到 Xcode iOS 项目时,我们必须执行额外的步骤,包括将文件添加到构建中的“复制捆绑资源”中项目配置的阶段选项卡。因此,我们正在考虑以最好的方式来处理这个问题(“最好”我的意思是该步骤根本不应该存在!),因为着色器作为字符串加载到 GPU,所以,最好的方法是什么在 API 中处理这些着色器?
避免将着色器文件与框架或静态库捆绑在一起的一种方法是将它们嵌入为字符串常量。我在这个项目中使用以下宏来执行此操作:
#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define SHADER_STRING(text) @ STRINGIZE2(text)
这让我可以执行如下操作:
NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING
(
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main()
{
gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
}
);
并使用 NSString 常量在需要时为我的程序提供着色器。这样就不需要着色器文件,这简化了分发过程。
您在 Xcode 中不会像专用顶点和片段着色器文件那样获得特定的语法突出显示,但您确实可以获得基本的 C 着色。