公式サンプルより。
このページから案内されているが、こちらから調べるのもあり。
Creating and Sampling Textures
概要:Image.tga というファイルを NSdata の形式にして Texture を生成。三角形領域に貼り付ける。
応用:サンプルでは tga ファイルのみにしか対応していないが、bmp ファイルあたりへの拡張はそんなに難しくない。
自分でバイナリ値の配列を作成して texture に渡してもいい。
課題:texture を更新したいなどというとき上手い方法が思いつかない。
厳密には更新にはなっていないのだが、texture に変化をつける方法(↓)。
drawInMTKView 側には、最低、描画する際にその都度必要となる texture と commandBuffer があればいいはずなので、そのように構成したらうまく動きました。
参考:
Reading Pixel Data from a Drawable Texture
概要:画面上をクリック→ドラッグするとその領域をピクセルデータとして CPU 側で読み込み、ファイルとして出力する。
感想:ピクセルをインタラクティブにデータとして書き出したい場合、使えるかもしれない。
Animating and Denoising a Raytraced Scene
概要:3D系のサンプルとしては一番簡単?
メモ:3DCG で頻出の変換行列(Transform Matrix)も定義が一番簡単。
Loading textures and models using Metal fast resource loading
We’ll also explore how you can create separate queues that run parallel to — and synchronize with — your GPU render and compute work.
とワクワクするが、動画が視聴できない。。。
概要:解読中
技術的特徴:
[blitEncoder copyFromBuffer:buffer
sourceOffset:0
sourceBytesPerRow:ktx.mipmapBytesPerRow[level]
sourceBytesPerImage:ktx.mipmapBytesPerImage[level]
sourceSize:ktx.mipmapSizes[level]
toTexture:texture
destinationSlice:0
destinationLevel:level
destinationOrigin:MTLOriginMake(0, 0, 0)];
で buffer から高速に texture を更新している。
view に表示されているオブジェクトは回転してるのだが、drawInMTKView メソッドで
[self updateAnimationAndBuffers];
// Begin the forward render pass.
[self drawSceneWithCommandBuffer:commandBuffer];
// Submit the command buffer for rendering.
[commandBuffer addCompletedHandler:^(id _Nonnull cmdBuffer)
{
dispatch_semaphore_signal(self->_inFlightSemaphore);
}];
[commandBuffer presentDrawable:_mtkView.currentDrawable];
[commandBuffer commit];
として実現している。
Modern Rendering with Metal
概要:3D のサンプルプログラムの集大成と言っていい内容。
仮想の街中を散策できます。
しかし、テクニックてんこ盛りで初心者は何やっているかわからないのではないでしょうか?
Rendering a Scene with Forward Plus Lighting Using Tile Shaders
概要:前出の Modern Rendering に比べれば、はるかに簡易化されている。
アプリを起動するとメリーゴーランドが回転する。
技術内容:カメラに相当するクラスがソースコード上では出てこないので実際にオブジェクトを回転させているんでしょうか。
公式サンプルでは学べない Metal
上のサンプルプロジェクト群はあくまでアップルが Metal の基本的な使い方や新機能の紹介などで実際のコードを示す必要があるため、作成・公開されていると思います。
だから、画像処理のプログラムとして見たときには必ずしも標準的なロジックをとっているかというとそんなことはないように思えます。
私たちが気がついたのは(3次元処理に関するサンプルのほとんどがそうですが)シェーダーへのデータの渡し方が座標ベースで、行列など諸々を含めてパックして送るという通常のやり方をとっていません。
具体的には『metal 入門』で指摘していますので、興味のある方は読んでみてください。
その点は注意が必要でしょう。