2015-11-16 15 views
7

私は1つのアプリケーションでSKViewとMTKViewを実行しており、これまでのところうまく機能しています。SceneKitまたはSpriteKitと一緒に純粋なMetal-APIを使用

唯一のことは、両方のビューが視覚的に統合されていないことです。彼らはちょうど並んでいます。しかし、SKView内の純粋な金属レンダリングをSKNodeの内部で動かしたいと思っています。これは、SKView内部の高速表示の一種です。

かなりの計算とレンダリングのものを実行している金属面で。 SKViewは、純粋な金属部品の重い計算と最小限ではあるが非常に速いレンダリングのための素晴らしいUIを提供する必要があります。

SCNRendererがrenderAtTimeで独自のMTLCommandBufferとMTLRenderPassDescriptorをレンダリングする可能性を提供しているので、私は既にSpriteKitシーンのオーバーレイでSceneKitを使用することを考えました。

私は次のSCNSceneRendererDelegateメソッドを実装し、commandBufferを準備している自分のレンダリング関数を呼び出しました。

func renderer(renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: NSTimeInterval) { 
    nodeArray.render() 
} 

commandBufferの準備ができたら、私はSCNRendererのrenderAtTimeメソッドを呼び出します。試行錯誤で、renderAtTimeを呼び出した後でコマンドバッファがコミットされなければならないことがわかりました。私はそれをする前にアプリをクラッシュさせます。私がそれを全くしないと、アプリをフリーズします。

func bufferFinished(renderer:SCNRenderer, commandBuffer: MTLCommandBuffer, renderPassDescriptor: MTLRenderPassDescriptor){ 
    let current=CFAbsoluteTimeGetCurrent() 
    renderer.renderAtTime(current, viewport: gameView.bounds, commandBuffer: commandBuffer, passDescriptor: renderPassDescriptor) 
    commandBuffer.commit() 
} 

これを行うとアプリが実行されていますが、追加のメタルコンテキストは表示されません。 金属部分のせいで全体が複雑になると思います。

純粋な金属が、SceneKitビューまたはそれ以上のSpriteKitビューでレンダリングされる単純なサンプルはありますか?一緒に働いて

+2

SceneKitとSpriteKitは、金属を使ってコンテンツを「裏口」でレンダリングします。純粋な金属を使用する場合は、SpriteKitとMetalを同時に使用することはできません。彼らは別の目的の2つの別々の技術です。 –

+1

Nah。 UIKitと同様に、Sprite KitとScene Kitの目的は、どちらもMetalの目的の部分的なサブセットです。 Sprite KitとScene KitはMetalベースのライブラリとして理にかなっていますが、現在はゲームエンジンに似ていますが、クロスプラットフォームにならないと意味がありません。 – Jessy

+0

これを行う方法があります。たとえば、SCNRenderの場合:https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNRenderer_Class/index.html#//apple_ref/doc/uid/TP40012014-CLSCHSCNRenderer-DontLinkElementID_4 またはSCNSceneRenderer: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNSceneRenderer_Protocol/#//apple_ref/doc/uid/TP40012016-CLSCHSCNSceneRenderer-DontLinkElementID_11 – Oliver

答えて

3

メタル、SpriteKitベース& SceneKit

SpriteKitベース& SceneKit。 SpriteKit内でSceneKitを使用することができ、その逆も可能です。

SpriteKitでは、SK3DNodeを使用してSceneKitシーンをレンダリングできます。次に例を示します。https://github.com/CloakedEddy/SK3DNode-example/tree/master/SKSCN%20Crossover

SceneKitでは、SCNViewによって継承されたSCNSceneRendererのoverlaySKSceneプロパティを使用できます。 SceneKitシーンと一緒にSpriteKitシーンをレンダリングすることができます。

しかし、どのように金属を統合するのですか?

SpriteKitで金属を使用するには、テクスチャを使用します。テクスチャをGPU上の金属で計算し、modifyPixelDataWithBlockを介してイメージデータをSKMutableTextureに転送します。これは動作していますが、SpriteKitは金属ではなく、舞台裏でOpenGLを使って作業しています。したがって、OpenGL-Textureを作成する必要があります。このTextureは、わかるように非常に高価です。

もう1つの問題は、大規模なテクスチャを使ってCPUメモリにフェッチする場合、GPUデータを同期させる必要があることです。それだけで、データをSKMutableTextureにコピーすることができます。これは、データがGPUに再び送られるので、非常に非効率的ですが、今はOpenGLを使用しています。あなたはGPUへの基本的な枠組みとしてのOpenGLや金属を持ちたい場合は、選択することができますSceneKitで

enter image description here

。また、materialプロパティのテクスチャを金属で直接変更することもできます。 SCNMaterialPropertyのcontentsプロパティを設定するだけです。また、オブジェクトのジオメトリを変更したい場合は、SCNGeometrySourceをメタルで直接変更することもできます。

+0

SpriteKitでのMetalのレンダリングに関する更新? – Hexagons

関連する問題