为什么Xcode不能识别这些着色器?

时间:2013-06-05 00:32:30

标签: ios xcode glsl nsbundle vertex-shader

我正在尝试自学Xcode,Objective-C,iOS应用程序开发和GLSL。 (可能不可取,我知道。;-)我一直在修改GLCameraRipple示例,到目前为止取得了很大的成功!但是,当我尝试创建一些新的顶点和片段着色器时,我感到难过。

示例附带名为“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;
}

我需要做些什么来完成这项工作?我甚至不知道从哪里开始:在为iPad编译时,Xcode是否未能在NSBundle中包含我的新着色器?我必须调用什么神奇巫毒来说服Xcode加载我的新着色器? (或者我是在完全在错误的地方寻找答案?)之前有其他人遇到过类似的问题吗?

在文本编辑器中检查“project.pbxproj”文件时,我注意到了一个不同处理着色器的部分:

/* 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 /* Icon-Small@2x.png in Resources */,
                            B6388B30141AB58300DA02FB /* Icon.png in Resources */,
                            B6388B31141AB58300DA02FB /* Icon@2x.png in Resources */,
                            C3E55C21175C49F9007C299D /* Default-568h@2x.png 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”的东西叫做“Resources”,而“Reflection.vsh”就是所谓的“Sources”。我认为这是问题的一部分。但是(a)这甚至意味着什么,以及(b)我该如何解决它?在文本编辑器中编辑project.pbxproj是否安全???

1 个答案:

答案 0 :(得分:3)

你差不多了 - xcode需要知道这些是需要复制的资源,而不是源代码。无需手动编辑项目文件,在xcode中很容易修复:

  • 选择您的项目(从左侧列开始)
  • 选择目标
  • 选择构建阶段选项卡
  • 如果着色器出现在“编译源”中,请将其删除
  • 将着色器添加到“复制捆绑资源”

就是这样!请记住,您必须为添加的每个新着色器执行此操作。