在编写新的Core Image过滤器时,您需要在Core Image Kernel Language中编写内核,这是一种轻微变异的OpenGL着色器语言。你可以在运行时用这样的东西编译它们......
NSString *myCode = ...
NSArray *kernels = [CIKernel kernelsWithString:myCode];
问题是任何语法错误,你只需返回一个nil而不是一个数组。记录的API没有提供获取诊断信息的机制。
如果您按照Apple文档中的建议使用Quartz Composer中的过滤器,您会发现它可以为您提供语法错误信息。 (这仅适用于简单的过滤器。)
那么,如何获取错误的内核源文件的诊断信息呢?
更新:根据具体情况,您可能会在控制台上显示格式化的行。如果您很幸运,那么您不必担心这一点,只需寻找以下几行:
8: error: in function kernel vec4 clipDetection (uniform in sampler, uniform in float)
8: error: unknown variable name: gratuitous
当然,如果你仍然需要掌握这些信息......
答案 0 :(得分:4)
如果在CIKernel类上使用内省,则会找到kernelsWithString:messageLog:方法。它没有公共接口,但不要让它阻止你......
NSString *myCode = ...
NSMutableArray *messageLog = [NSMutableArray array];
NSArray *kernels = [[CIKernel class] performSelector:@selector(kernelsWithString:messageLog:) withObject:myCode withObject:messageLog];
if ( messageLog.count > 0) NSLog(@"Error: %@", messageLog.description);
messageLog参数想成为一个可变数组。如果出现错误,将会有一些字典。这些内容在互联网上无法显示,但它们看起来像这样(在我向内核的源添加“无故错误”的情况下)......
2012-12-06 17:56:53.077 MyProgram[14334:303] Error: (
{
CIKernelMessageDescription = "kernel vec4 clipDetection (uniform in sampler, uniform in float)";
CIKernelMessageLineNumber = 8;
CIKernelMessageType = CIKernelMessageTypeFunctionName;
},
{
CIKernelMessageDescription = "unknown variable name: gratuitous";
CIKernelMessageLineNumber = 8;
CIKernelMessageType = CIKernelMessageTypeError;
}
)
与往常一样,请考虑将其保留在运输代码中。它没有记录,Apple可以随时对它做任何事情。他们甚至可能会记录下来。