問題タブ [metalkit]

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 投票する
1 に答える
770 参照

metal - METAL 頂点/フラグメント シェーダーの結果を「インターセプト」する最良の方法

現在MTLTexture、入力用があり、20 ~ 30 個の頂点のセットを使用して断片的にレンダリングしています。drawRectこれは現在、私のハンドラの末尾で行われていますMTKView:


ただし、最終的な処理を行う前にpresentDrawable、結果のテクスチャをインターセプトしたいと思います (その領域を別の に送信しますMTKView)。つまり、呼び出しMTLTexture後に何らかの出力にアクセスする必要があります。drawPrimitives

これを行う最も効率的な方法は何ですか?

1 つのアイデアは、代わりにdrawPrimitives中間出力に追加のレンダリングを導入することです。MTLTextureこれを行う方法はわかりませんが、その過程でその出力テクスチャをスクープします。これは他の場所(つまり、画面外)でも行われるのではないかと思います。

次にdrawPrimitives、その outputTexture を使用して 1 つの大規模なテクスチャ クワッドを使用して 2 番目を発行し、次にそのpresentDrawable上に を発行します。そのコードは、以前のコードがあった場所に存在します。

の出力テクスチャをキャプチャできるようにする単純なメソッドが Metal API にある可能性があります (私が見逃しています) drawPrimitives

の使用を検討しましたMTLBlitCommandEncoderが、特定の MacOSX ハードウェアではいくつかの問題があります。


更新#1: idoogy、これがあなたが要求していたコードです:

ここで、最初の「輝度出力」テクスチャを作成します...これを行うために、頂点シェーダーで飛行中です。


以下では、補助ビューのdrawRectハンドラーでinputTexture、転送されるテクスチャとして、そのサブ領域を表示しています。これは、内部タイマーではなくMTKView、結果として描画されるように構成されていることに注意してください。setNeedsDisplay


上記のコードは問題なく動作するようです。そうは言っても、Xcode デバッガーでは別の話をしていると思います。この方法で膨大な時間を無駄にしていることは明らかです...その長いコマンドバッファは、多くの待機を行う補助的なモニタービューです...

ここに画像の説明を入力

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

ios - iOS シミュレーター ターゲットのビルド時に .metal ファイルを無視する

x86_64 ターゲット (iOS シミュレーター) への金属シェーダーを含むプロジェクトをビルドするたびに、依存関係分析の警告が表示されます。

warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64

これが大きな問題ではないことはわかっていますが、実際に問題が発生したときに実際に黄色の三角形の警告が表示されるように、ビルド時にプロジェクトに警告が表示されないようにしたいと考えています。

Xcode にシミュレータ ターゲットのメタル ファイルを無視させる簡単な方法はありますか?

0 投票する
0 に答える
294 参照

macos - OS X Metal アプリでの画面の不具合? エラー (IOAF コード 1)?

Metal を使用して OS X Sierra でアプリを作成しています。私がやっていることは、画面がひどくグリッチし始め、さまざまな場所で黒く点滅し、すぐに画面全体が黒くなります。

XCode で GPU フレーム キャプチャを使用すると、一時停止したフレームは正しく表示されますが、黒い深淵から突然戻ってきます。GPU フレーム情報にエラーや警告が表示されません。ただし、私は Metal に比較的慣れておらず、フレーム デバッガーの経験もありません。

通常、コンソールには何も表示されませんが、ときどき次のいずれかが表示されます。

実行中にエラーが発生したため、コマンド バッファの実行が中止されました。内部エラー (IOAF コード 1)

同じアプリを iOS デバイスで実行しても、この問題は発生しません。これまでのところ、問題は OS X でのみ発生します。何を確認する必要があるかについての提案はありますか?

役立つコードがあれば投稿できますが、現時点では、プログラムのどの部分に問題があるかはわかりません。

編集: Noah Witherspoon への対応 - 問題は、私のシーン描画と UI 描画の間の何らかの相互作用によって引き起こされているようです。太くてぼやけた線で構成されている自分のシーンだけを表示すると、問題は発生しません。また、正投影である UI のみを表示し、角の丸い四角形と何らかのタイプを表示しても発生しません。この問題は、両方が表示されている場合にのみ発生します。これは大量のコード、多数のバッファー、および大量の commandBuffer の使用法であり、投稿するには多すぎます。しかし、ここで少しです。

私の行は、頂点ごとに 4 つの float の配列である頂点バッファーでレンダリングされます。

これらは次のようにレンダリングされます。

コマンド Buffer を使用して描画するためのメイン ループを次に示します。

線の描画は strokeNode.subrender で行われ、UI の描画は mainscreen.draw で行われます。UI の描画には多くのコンポーネントがあります (ここにリストする必要はありません) が、それらを 1 つずつ取り出して、絞り込めるかどうかを確認します。これで問題がないように見える場合は、その一部を編集して投稿します...

ありがとう!