2012-12-07 5 views
2

새 코어 이미지 필터를 작성할 때 약간 변형 된 OpenGL 쉐이더 언어 인 코어 이미지 커널 언어로 커널을 작성해야합니다. 당신은코어 이미지 커널에서 구문 오류를 어떻게 디버그합니까?

NSString *myCode = ... 
NSArray *kernels = [CIKernel kernelsWithString:myCode]; 

문제는 구문 오류입니다 ...이 같은 뭔가 런타임에이를 컴파일하고 그냥 배열 대신 전무를 다시 얻을. 문서화 된 API는 진단 정보를 얻기위한 메커니즘을 제안하지 않습니다.

Quartz Composer에서 필터를 작업하는 경우 Apple 문서에서 권장하는대로 구문 오류 정보를 제공 할 수 있습니다. (이것은 단순한 필터에만 적용됩니다.)

그래서 나쁜 커널 소스 파일에 대한 진단 정보를 어떻게 다시 얻습니까?

업데이트 : 상황에 따라 콘솔에 형식이 지정된 줄이 표시 될 수 있습니다. 당신이에 반성을 사용하는 경우 ... 당신은 여전히 ​​정보의 보류를 얻을 필요가있는 경우 물론

8: error: in function kernel vec4 clipDetection (uniform in sampler, uniform in float) 
8: error: unknown variable name: gratuitous 

답변

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

언제나, 2 회에 대한 자세한 생각 ... 이들의 내용은 인터넷에서 갑자기 볼 수 문서화되어 있지만 (나는 커널의 소스를 "무상 오류"추가 된 경우)이 같을 이것을 선적 부호로 남겨 둡니다. 문서화되지 않았으므로 언제든지 Apple에서 아무 것도 할 수 없습니다. 그들은 문서화 할 수도 있습니다.

+0

어떻게 Swift @bitmusher로 번역 하시겠습니까? –