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;
    }
)

いつものように、これを配送コードに残すことについて2回以上考えてください。それは文書化されておらず、Appleはいつでもそれに何でもすることができます。彼らは、あなたが知っているように、それを文書化するかもしれません。

于 2012-12-07T00:17:17.397 に答える