FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


shader modifiersでバグ回避

SceneKitでシェーダを適用すると不具合発生?
↑APPLEにバグレポ出したってのはここで書いてるんだけど、そしたら担当の人から
「ほな shader modifiers やったらどうや?」
って返事が来た。

え?shader modifiersって何?
と思っていろいろ調べて、あー、そういうのもあるのねと。

SCNShadable - SceneKit | Apple Developer Documentation
↑公式リファレンスに参考になるコードがある。
{
    SCNMaterial *material = node.geometry.firstMaterial;
    material.shaderModifiers = @{
                                 SCNShaderModifierEntryPointGeometry :
                                     @"_geometry.position.x = _geometry.position.x+2;" ,
SCNShaderModifierEntryPointFragment :
                                     @"uniform sampler2D mainTexture;"
                                     "_output.color = texture2D(mainTexture, _surface.diffuseTexcoord);"
};

    SCNMaterialProperty *imageProperty = [SCNMaterialProperty materialPropertyWithContents:@"paper5.jpg"];

    [SCNTransaction begin];
    [material setValue:imageProperty forKey:@"mainTexture"];
    [SCNTransaction commit];

}
↑自分なりにいじりつつ書いたコード。簡単な例だけど、オブジェクトはx軸方向に移動し、テクスチャを変更する、という今までならvertex shaderとfragment shaderでやってきたことと同等の処理をshader modifiersを使ってできるようになった。まだ十分じゃないのでいろいろと試していかないとまだダメだけど。

なお、shaderに相当する記述をこんなところに書くのは見通しが悪い!気色悪いわ!と俺は思ったんだが、このshaderModifiersに渡すdictionaryのshaderに相当する部分は文字列(NSString)でいいので
NSString *vertexShader =[self loadVertexShader];
みたいにして別ファイルに記述したのを読み込んでshaderModifiersに与えても動いた。
{
    material.shaderModifiers = @{
        SCNShaderModifierEntryPointGeometry : vertexShader,
        SCNShaderModifierEntryPointFragment : fragmentShader 
    };
}
これですっきりやわ。

で、この形式でシェーダーを与えたら、、、

意図通り表示されたオブジェクト

↑意図通りに表示された!!!
そうなの、、、?こっちならいけるのは何でだろう?と深く考えるのはよそう、だってSceneKitだもの(みつを)。

ちなみにバグレポで「これやったらいけたで!」って返事しようとしたら
No response received. Now closing this bug.
って書いててCLOSEDになってて返事できない状態。1ヶ月ほど返事しなかったらそうなるのかな。案外迅速なのね、、、

<< 強化学習(DQN)で3枚板のロボットを歩かせる(2)  TopPage  強化学習(DQN)で3枚板のロボットを歩かせる >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1157-8582239b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad