2013-06-05 2 views
1

저는 Xcode, Objective-C, iOS 앱 개발 및 GLSL을 모두 한 번에 가르치려고합니다. (아마도 적당하지는 않지만 알고 있습니다. ;-) 저는 GLCameraRipple 예제를 수정 해 왔으며 지금까지 많은 성공을 거두었습니다! 그러나 오늘 새로운 버텍스 및 조각 쉐이더를 만들려고 할 때 나는 혼란스러워졌습니다.Xcode에서 이러한 쉐이더를 인식하지 못하는 이유는 무엇입니까?

예제에는 "Shader.vsh"및 "Shader.fsh"라는 셰이더가 있습니다. File-> Duplicate를 사용하여 각각 "Reflection.vsh"및 "Reflection.fsh"라는 복사본을 만들었습니다. 문제는 Xcode에서 새 셰이더를 인식 할 수 없다는 것입니다. 원래 버텍스 쉐이더를로드이 코드는 잘 작동합니다 :

vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"]; 
NSLog(@"Original vertex shader should be here: %@", vertShaderPathname); 
if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) { 
    NSLog(@"Failed to compile original vertex shader"); 
    return NO; 
} 

하지만 내 새로운 "Reflection.vsh"쉐이더를로드하려고이 코드는 실패합니다. 특히, reflectVertShaderPathname 문자열은 (null) 값으로 돌아옵니다.

reflectVertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Reflection" ofType:@"vsh"]; 
NSLog(@"Reflection vertex shader should be here: %@", reflectVertShaderPathname); 
if (![self compileShader:&reflectVertShader type:GL_VERTEX_SHADER file:reflectVertShaderPathname]) { 
    NSLog(@"Failed to compile reflection vertex shader"); 
    return NO; 
} 

이 작업을하려면 어떻게해야합니까? 어디서부터 시작해야할지 모르겠다. Xcode는 iPad 용으로 컴파일 할 때 NSBundle에 새로운 쉐이더를 포함시키지 못하고 있습니까? Xcode에서 내 새 셰이더를로드하도록 유도하려면 어떤 마법 부두를 사용해야합니까? (아니면 내가 잘못된 장소에서 답변을 찾고 있습니까?) 다른 누구도 전에 비슷한 문제에 부딪 혔습니까?

/* Begin PBXResourcesBuildPhase section */ 
      B66E3E2C13E9E79C00D2ACF0 /* Resources */ = { 
        isa = PBXResourcesBuildPhase; 
        buildActionMask = 2147483647; 
        files = (
          B66E3E4713E9E79C00D2ACF0 /* Shader.fsh in Resources */, 
          B66E3E4913E9E79C00D2ACF0 /* Shader.vsh in Resources */, 
          B66E3E4F13E9E79C00D2ACF0 /* RippleViewController_iPhone.xib in Resources */, 
          B66E3E5213E9E79C00D2ACF0 /* RippleViewController_iPad.xib in Resources */, 
          B6388B2C141AB58300DA02FB /* Icon-72.png in Resources */, 
          B6388B2D141AB58300DA02FB /* Icon-Small-50.png in Resources */, 
          B6388B2E141AB58300DA02FB /* Icon-Small.png in Resources */, 
          B6388B2F141AB58300DA02FB /* [email protected] in Resources */, 
          B6388B30141AB58300DA02FB /* Icon.png in Resources */, 
          B6388B31141AB58300DA02FB /* [email protected] in Resources */, 
          C3E55C21175C49F9007C299D /* [email protected] in Resources */, 
        ); 
        runOnlyForDeploymentPostprocessing = 0; 
      }; 
/* End PBXResourcesBuildPhase section */ 

/* Begin PBXSourcesBuildPhase section */ 
      B66E3E2A13E9E79C00D2ACF0 /* Sources */ = { 
        isa = PBXSourcesBuildPhase; 
        buildActionMask = 2147483647; 
        files = (
          B66E3E4113E9E79C00D2ACF0 /* main.m in Sources */, 
          B66E3E4513E9E79C00D2ACF0 /* AppDelegate.m in Sources */, 
          B66E3E4C13E9E79C00D2ACF0 /* RippleViewController.m in Sources */, 
          B6670DB413E9FD9F00AEF9EC /* RippleModel.m in Sources */, 
          C359BF4D175EA71C00D801B9 /* Reflection.fsh in Sources */, 
          C359BF4F175EA72A00D801B9 /* Reflection.vsh in Sources */, 
        ); 
        runOnlyForDeploymentPostprocessing = 0; 
      }; 
/* End PBXSourcesBuildPhase section */ 

그래서 "Shader.vsh"처럼 보인다라는 뭔가에 "텍스트 편집기에서"project.pbxproj "파일을 검사

, 나는 쉐이더가 다르게 취급되고있는 섹션을 발견 리소스 ","Reflection.vsh "는"소스 "라고하는 부분에 있습니다. 그게 문제의 일부라고 생각합니다. 그러나 (a) 그 의미는 무엇이며, (b) 어떻게 해결해야합니까? 텍스트 편집기에서 project.pbxproj를 편집하는 것이 안전합니까 ???

답변

3

거의 알아 냈습니다. xcode는 원본이 아닌 복사해야하는 리소스라는 것을 알아야합니다. 손으로 프로젝트 파일을 편집 할 필요가,이 엑스 코드에서 해결하기 쉬운 없습니다 : 빌드 단계 탭을 선택

  • 대상을 선택 (왼쪽 열에서) 프로젝트를 선택

    • 쉐이더는 "소스를 컴파일"에 표시하면, 사용자들은 쉐이더에 "복사 번들 리소스"추가 그들에게

  • 를 제거! 추가하는 모든 새 셰이더에 대해이 작업을 수행해야합니다.

  • +0

    환상적인! 호기심에서, 나는 이맥스에서 project.pbxproj를 편집하고 Shaders를 "Sources"에서 "Resources"로 옮겨 보았습니다. 실제로 효과가있었습니다. 그러나 Xcode 자체에서이를 수행 할 수있는 적절한 방법이 있다는 것을 아는 것은 좋은 일입니다. 다음 번에는 확실히 그렇게 할 것입니다. 정말 고마워! – otherthings