2

在编写新的核心图像过滤器时,您需要使用核心图像内核语言编写内核,这是一种轻度变异的 OpenGL 着色器语言。你在运行时用类似这样的东西编译它们……</p>

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

当然,如果你还需要掌握信息……</p>

4

1 回答 1

4

如果你在 CIKernel 类上使用自省,你会发现 kernelsWithString:messageLog: 方法。它没有公共接口,但不要让它阻止你……</p>

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 参数想要成为一个可变数组。如果出现错误,它会放入一些字典。这些内容的文档在互联网上无处可见,但它们看起来像这样(在我将“无故错误”添加到内核源代码的情况下)......</p>

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 可以随时对它做任何事情。你知道,他们甚至可能会记录下来。

于 2012-12-07T00:17:17.397 回答