3DCG

Metal と OpenGL

OpenGL はネット上で独学できるリソースが転がっているのがいいなあ。

独学で一ヶ月間 OpenGL を学んで得た基礎知識のまとめ

このシリーズは、初学者向け。軽快な口調で読みやすい。

Metal はなあ・・・(遠い目)。

メモ

某プロジェクトでキモになるのはシェーダーへの頂点データの渡し方。

具体的には、以下の for in ループで以下のように渡している。

      for mesh in model.meshes {
        let vertexBuffer = mesh.mtkMesh.vertexBuffers[0].buffer
        renderEncoder.setVertexBuffer(vertexBuffer, offset: 0,
                                      index: 0)

        for submesh in mesh.submeshes {
          let mtkSubmesh = submesh.mtkSubmesh
          renderEncoder.drawIndexedPrimitives(type: .triangle,
                                              indexCount: mtkSubmesh.indexCount,
                                              indexType: mtkSubmesh.indexType,
                                              indexBuffer: mtkSubmesh.indexBuffer.buffer,
                                              indexBufferOffset: mtkSubmesh.indexBuffer.offset)
        }
      }

mtkMesh が良い感じに効いていると思うのだが、なんらかの事情でこれが使えない場合はどうするのか???

たまにはリアル勉強会にも参加しよう

・・・などと Metal 関係については、たいそう歯切れ悪く書いていたが、現在は、いくらか改善された。

というのはたまたま参加した iOS/MacOS の勉強会で、軽くレクチャーを受けたらこの分野の理解がかなり深まったから。

それまでは、これまで同様、ある程度理解した後に、サンプル作成して理解を深めようと思っていたのだが、こと、この分野に関してはそれでは効率的でないようだ。

画像処理、特に 3DCG の領域では、プログラミング的な能力より、数理的な理論の理解の方が重要なので、理解度が足踏みしていると感じたら、分かっている人に聞くのも一つの手でしょう。

 

Metal 関係リソース物色中

あまり勉強したことがない Metal 関係のリソースを物色中。

公式サンプル

おお!と思ったのは公式のサンプル紹介記事にあったこのプロジェクト(群)。

C++ と書いてあるが、「どーせ、これ Objective-C++ でしょ?」と思っていたが、れっきとした C++ だった。
例えば、Xcode で GUI アプリを作成した際、自動で生成される main.m に相当する部分は

int main( int argc, char* argv[] )
{
    NS::AutoreleasePool* pAutoreleasePool = NS::AutoreleasePool::alloc()->init();

    MyAppDelegate del;

    NS::Application* pSharedApplication = NS::Application::sharedApplication();
    pSharedApplication->setDelegate( &del );
    pSharedApplication->run();

    pAutoreleasePool->release();

    return 0;
}

となっている。
言われてみれば Objective-C++  と C++ との対応はこうですね、って感じ。

三角形ばかり書いていてもつまらん

そんな方はこちらなんかも。

ただし、これは Swift の iOS プロジェクトなので、MacOS に移植する際にはいくらか(↓)修正が必要。

cocoa アプリでの Metal Viewer の取り扱い

手動で追加する。

NSObect のサブクラスとして適当な名前のクラスを作成した後に、MTKViewDelegate を書き加える。

また、以下の二つのメソッドは MTKViewDelegate を継承するには必須のようなので、付け加える。

 

参考(追記)

MacでObjective-cを使ってMetalを初期化

のシリーズを使って勉強しよう・・・と思っていたのだが、これは Objective-C で Metal を扱う際にはイマイチのやり方のようだ。

もともとアップル公式のサンプルは Objective-C で書かれており、これを Swift に移植したものが、上記シリーズ(というかネットに落ちている情報全般)っぽい。

この記事にならって丹念にアップル公式のサンプル眺めていくしかないかな。