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;
}
これを機能させるにはどうすればよいですか? Xcode は、これを iPad 用にコンパイルするときに作成する 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」は「リソース」と呼ばれるものにあり、「Reflection.vsh」は「ソース」と呼ばれるものにあるようです。それが問題の一部だと思います。しかし、(a) それはどういう意味ですか? (b) どうすれば修正できますか? project.pbxproj をテキスト エディタで編集しても安全ですか?