这是将OpenGLES着色器作为iOS版API的一部分进行处理的最佳方式



在为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着色。

最新更新