私は現在、Metalを使用して大規模な iOS 8 アプリをコーディングしています。重要な例がないため、非常に苛立たしいことが証明されており、実際には (設計上) DirectX や OpenGL ES (どちらも私が知っている) とは少し異なります。
現在、単一の頂点/インデックス バッファーを使用し、シェーダーで派手なことを行うチュートリアルしか見つけることができません。頂点が異なる複数のオブジェクトとシェーダー ユニフォームを同じフレームに描画する方法を知りたいです。
「MetalImage」と呼ばれる iOS 画像およびビデオ処理用の便利な金属ライブラリを試してください。github を参照してください: https://github.com/erickingxu/MetalImage.git
ここでは、さまざまなソースからドキュメントを取得して、私が行った実装を見つけることができます。
良い出発点だと思います。
基本的に、この Swift プロジェクトには次のものがあります。
RayWenderlich 入門メタル チュートリアルを変更して、異なるリソースを持つ複数のオブジェクトを同じフレームに描画するには、最初に、オブジェクトごとに個別の MTLRenderPipelineState (特にシェーダーを定義) と MTLBuffer (頂点/インデックスを定義) を作成する必要があります。
次に、Render Command Encoder 内のオブジェクトをループして、一意のオブジェクトをバインドし、endEncoding() を呼び出す前に drawPrimitives() を呼び出すだけです。
-「三角形のレンダリング」部分のステップ 4 では、次のようになります。
let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
if let renderEncoder = renderEncoderOpt {
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1)
renderEncoder.endEncoding()
}
これに変わります:
let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
if let renderEncoder = renderEncoderOpt {
for drawable in drawables {
renderEncoder.setRenderPipelineState(drawable.pipelineState)
renderEncoder.setVertexBuffer(drawable.vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: drawable.vertexCount, instanceCount: 1)
}
renderEncoder.endEncoding()