問題タブ [metal]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1219 参照

ios - Metal シェーダー コードが「クラッシュ」するのはどのような状況ですか?

私は Metal ベースのアプリを開発しています。場合によっては、適切にコンパイルおよびリンクされたシェーダー コードによって、エラーが発生することなくアプリケーションが単純にクラッシュすることがあります。

「クラッシュ」は、視覚的な出力の停止 (場合によっては、いくつかの交互フレームの短いスタッターが先行する) で構成されますが、それ以外の場合は、アプリケーションの残りの通常の進行です。Xcode パフォーマンス監視ユーティリティは 60fps を報告しますが、GPU レイテンシは 0ms であり、CPU 側の実行は継続し、Metal API への呼び出しは引き続き正常に完了します。

コンソールにエラーは報告されません。

これは、シェーダー コードのどこからエラーが発生したかを示す兆候がないため、デバッグが非常に困難です。これが実際にどのような条件下で発生するのかを知っていれば、チェックすべき項目のリストを作成できるので助かります。それ以外の場合は、これが発生するたびに暗闇で撮影しています。

0 投票する
1 に答える
244 参照

3d - インスタンス化されたレンダリングに関連するオーバーヘッドは?

インスタンス化されたレンダリングを多用するレンダリング システムを構築しています。私が理解しているように、インスタンス化されたレンダリングは、総ドローコールと、GPU に保存する必要がある生の頂点データの量を減らすことができるため、一般的により効率的です。

インスタンス化されたレンダリングは、生の頂点データを単純に送信する場合と比較して、ある時点でオーバーヘッドが発生すると予想されます。現在の描画システムでは、非常に小さな頂点データ (それぞれ 6 つの頂点) の多くのインスタンス (数千) が生成されます。

インスタンス化されたレンダリングは私の描画システムに非常にうまく適合し、「冗長な」頂点データの生成を避けることができますが、この数の小さなインスタンスを描画すると GPU に余分な負担がかかるのではないかと心配しています。これは事実ですか?

0 投票する
1 に答える
1283 参照

ios - 金属にはバックバッファーがありますか?

現在、Metal アプリで視覚的なポップ音を追跡していますが、バックバッファではなく、フレームバッファに直接描画しているためだと考えています。

後で何度かグーグルで検索しましたが、金属のバックバッファに関するドキュメントは見つかりませんでした。自分でロールバックできることはわかっていますが、メタルがバック バッファーをサポートしていないなんて信じられません。

CAMetalLayer オブジェクトをどのようにセットアップしたかを示すコード スニペットを次に示します。

CAMetalLayer オブジェクトでバックバッファを有効にすることはできますか? それとも独自にロールバックする必要がありますか?

0 投票する
1 に答える
1310 参照

ios - 計算シェーダーからの動的出力

計算シェーダーで 0 ~ 12 個の三角形を生成している場合、それらをバッファーにストリーミングして、画面へのレンダリングに使用する方法はありますか?

私の現在の戦略は次のとおりです。

  • float3sizeのバッファを作成するため、threads * 12可能な最大数の三角形を格納できます。
  • グリッド内のスレッド位置に依存するインデックスを使用してバッファーに書き込むため、競合状態は発生しません。

ただし、これからレンダリングする場合は、空のメモリをスキップする必要があります。それは醜いように聞こえますが、おそらく今のところ他に方法はありません。CUDA ジオメトリ シェーダーが可変長の出力を持つことができることは知っていますが、iOS のゲームが GPU で可変長のデータを生成できるかどうか、またはどのように生成できるかは疑問です。

更新 1 :

質問を書いてすぐに、各ブロックで使用可能な三角形の数を示す 2 つ目のバッファーを使用する可能性について考えました。頂点シェーダーは、そのブロックのすべての三角形のすべての頂点を処理します。

ただし、これは未使用のメモリの問題を解決しません。また、多数のスレッドがあるため、無駄になるメモリの合計はかなりの量になります。

0 投票する
1 に答える
3052 参照

ios - GPU フレーム キャプチャが Metal で機能しないのはなぜですか?

カメラ ボタンをクリックして GPU をキャプチャしてデバッグすると、ボタンが無効になるだけで他に何も起こりません。その後、XCode からアプリを停止すると、ビューが (紛らわしく) アシスタント エディターに切り替わり、両方のビューにソース コードが表示されます。

また、デバッグ パネルで FPS がゼロのままであることに気付きましたが、Metal シェーダーからレンダリングされたビデオを見ることができます。

新しいサンプル アプリを実行すると、GPU のデバッグが機能し、FPS が 60 になっていることがわかります。

Xcode 6.4 と iPhone 6 を使用しています。

0 投票する
1 に答える
1722 参照

ios - Metal の 3D テクスチャにデータをロードする

ドキュメントを読んで理解したところ、3D テクスチャには 1 つのスライスしかありません。ただし、データをロードしようとすると、次のエラーで失敗します。

ロードに使用されるコードは次のとおりです (テクスチャは typeMTLPixelFormatRG16Uintと size ですelementsInRow * elementsInRow * elementsInRow):

ここでelementsInRow128、地域はMTLRegion region = MTLRegionMake3D(50, 50, 50, 4, 4, 4);、データはuint16_t data[region.size.depth][region.size.height][region.size.width][2]です。

私も試しました:

しかし、メモリエラーが発生します。

こちらもご覧ください: https://forums.developer.apple.com/message/43332#43332

3D テクスチャの 3D 領域にデータを正しくロードするにはどうすればよいですか?

更新 1:

2 番目の例は、領域に深さが1あり、さらに大きい場合に機能widthしますheight(ただし、これを使用32x32x1するとクラッシュします)。

更新 2:

領域内のすべてのピクセルに同じ値を使用16x16x1して書き込むと、うまくいくように見えますが、データを画像としてエクスポートすると、代わりにランダム データが書き込まれているように見えます。画像の拡大されたセクションを参照してください。

ここに画像の説明を入力

テストを再度実行すると、画像の上部のセクションは均一な色になりますが、残りのポイントは強度が変わります。すべてのピクセルに同じ値を書き込んでいることに注意してください。したがって、領域は均一な色でなければなりません。