問題タブ [geometry-instancing]

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 に答える
5025 参照

opengl - OpenGL -- 複数のメッシュを個別の変換で一度にレンダリング

メッシュごとにドローコールを発行する必要がないように、一度に多くのメッシュをレンダリングする方法を探しています。ここでは 2D レンダリングを扱っていますが、正方形などの典型的なオブジェクトには三角形が 2 つしかない場合があります。ただし、オブジェクトが非常に複雑で、何千もの三角形がある場合もあります。

これで、各オブジェクトは単独で動き回ることができます。概念的には、「オブジェクト」ごとに VBO (または VBO/IBO ペア) を用意することは完全に合理的です。オブジェクトが変更されない限り、各フレームを GPU にアップロードする必要があるのは変換情報だけです。向きの値。または、同等に、変換行列。

しかし、そのアプローチの問題は、1000 個の正方形オブジェクトのシーンで、1000 個の VBO と 1000 個の IBO を初期化する必要があり、2000 個の三角形をレンダリングするために各フレームで 1000 セットのユニフォームを設定する 1000 個の描画呼び出しが必要になることです。

わかった。これらのオブジェクトがすべて同一である場合、それらを記述する VBO/IBO を 1 つ持つことができます。変換データを使用して、Uniform Buffer オブジェクト (または、Uniform 配列の方が適切かもしれません。これらの使用方法をまだ学習する必要があります) をセットアップできます。それぞれを呼び出し、1 つのインスタンス化描画呼び出しを発行して、頂点シェーダーが受信したインスタンス番号を使用して UBO から変換データをプルするようにします。偉大な。

もう一歩だけ進みたい。同一でないメッシュでのインスタンス化に相当するものを実行したい: 1000 の異なるオブジェクトがあり、1000 の個別の頂点/インデックス バッファー ペア、または 1 つの巨大な頂点/インデックス バッファーのペアで喜んで記述します。1 回の呼び出しで変換データを GPU に送信したいと考えています。ドライバー/GPU に適切な頂点をバインドまたは選択させるだけです。

これはできますか?SM4 ジオメトリ シェーダーを使用せずに実行できますか?

更新:これを達成するための潜在的な方法を考えました。変換を含む UBO にインデックスを付けるための「インスタンス化」値として、頂点属性を使用します。これはそれを行う方法ですか?

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

directx-11 - DirectX11 のジオメトリ シェーダーでインスタンス化するにはどうすればよいですか?

頂点シェーダーでは、次のようにすることを知っています。

ジオメトリ シェーダで instancedPosition を使用するのと同じことは何ですか?たとえば、1 つの頂点で構成されるモデルをインスタンス化し、各インスタンスに対してジオメトリ シェーダでクワッドを作成し、クワッドの位置を対応するインスタンスの位置に設定します。インスタンス バッファ内のインスタンス。

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

directx-9 - DirectX9 は、複数のマテリアルを持つメッシュにジオメトリのインスタンス化を使用します

複数のマテリアルを持つメッシュを処理できる柔軟な Geometry Instancing コードを作成しようとしています。1 つのマテリアルのメッシュの場合、すべて問題ありません。1 回の描画呼び出しで、必要な数のインスタンスをレンダリングすることができます。

複数のマテリアルを使用すると、状況が少し複雑になります。私のメッシュは .x ファイルから来ています。1 つの頂点バッファーと 1 つのインデックス バッファーがありますが、いくつかのマテリアルがあります。各サブセット (マテリアル) に対してレンダリングするインデックスは、属性配列に格納されます。

私が使用するコードは次のとおりです。

このコードは、最初のマテリアルに対してのみ機能します。2 番目のマテリアルでループを開始すると、レンダリングされないため、最初のマテリアルはインデックス 0 のものを意味します。しかし、PIX で頂点バッファをデバッグすると、すべてのマテリアルが適切に処理されていることがわかります。そのため、頂点シェーダーの後に何かが起こります。

もう 1 つの奇妙な問題です。インスタンス データを含むストリーム ソースを頂点サイズ 0 に設定すると、すべてのマテリアルがレンダリングされます。

だからこれの代わりに:

私はそれを次のように置き換えます:

しかしもちろん、このコードでは、同じインスタンス データを何度も再利用するため、すべてのインスタンスが同じ位置にレンダリングされます。

最後に、D3DCREATE_SOFTWARE_VERTEXPROCESSING でデバイスを作成すると、すべて正常に動作します。ハードウェアのみに問題がありますが、残念ながら DirectX はデバッグ モードで問題を報告しません。

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

c# - XNA ハードウェア インスタンス化: メッシュが完全にレンダリングされない

この短いチュートリアルに従って、基本的なハードウェア モデルのインスタンス化方法を XNA コードに実装しました 。 -テクスチャ/

必要なシェーダーを作成しました (ただし、テクスチャ アトラスはなく、単一のテクスチャのみ)。この方法を使用して、3DS Max 2013 を使用して生成し、FBX 形式でエクスポートした単純なツリーを描画しようとしています。

私が見ている結果は、何が起こっているのか手がかりがありませんでした。

なぜか幹のない木。

インスタンス化メソッドを使用せず、メッシュで Draw を呼び出すだけだったとき (レベルのすべてのツリーに対して)、ツリー全体が表示されました。

レンダリングは正しいが、インスタンス化されていない (レベルごとに数百のオブジェクトで非常に遅くなる可能性がある)

モデルにMesh が 1 つしか含まれておらず、 Mesh に MeshPart が 1 つしか含まれていないことを確認しました。

モデルの頂点とインデックス バッファーの "GetData<>()" メソッドを使用して頂点抽出メソッドを使用し、正しい数の頂点とインデックスを使用しているため、正しい数のプリミティブがレンダリングされます。レンダリングされている木の部分からわかるように、正しいテクスチャ座標と照明の法線も抽出されます。

また、木の部分も正しい場所にあります。

何の理由もなく、単に 1000 個程度のポリゴンが欠落しているだけです。頂点抽出とシェーダーのパラメーター生成のすべてのステップでブレークポイントを設定しましたが、何が間違っているのか一生わかりません。

私のシェーダーの頂点変換関数:

頂点バインディングとインデックス バッファーの生成:

すべての頂点情報を取得するために使用される頂点抽出方法 (この部分は、さまざまなシェーダーをテストし、それらを使用してそれらの周りにバウンディング ボックスを構築するために、ボックス、球体などのレベルにテスト用の幾何学的形状をロードするために以前に使用したので、正しく動作するはずです)頂点データを抽出し、すべて正しい):

これは、オブジェクト バッチ (この特定のケースではツリー) のレンダリング コードです。

何が起こっているのか完全に困惑しているので、誰かがどこからエラーを探し始めるか考えている場合は、頭に浮かぶすべてのアイデアを投稿してください。

これは、シェーダー コードまたは頂点生成で何かを台無しにして、画面上で絶対的な混乱が発生するという私の以前のすべての経験に逆らうことさえあります。 (0,0,0)、黒いテクスチャ、不適切な配置 (多くの場合、スカイボックスの外側または地形の下)、不適切なスケーリング...

これは、あたかも機能しているかのように、何かが異なります。表示されているツリーの部分は、一部が欠けていることを除いて、すべての側面 (位置、回転、スケール、テクスチャ、シェーディング) で正しいです。私にとって奇妙なのは、欠落している部分が論理的にセグメント化されているように見えることです。木の幹のプリミティブと、木の最も低い枝から離れたいくつかの葉だけが欠落しており、他のすべてのプリミティブはアーティファクトなしで正しくレンダリングされたままです。基本的に、それらは...正しく欠落しています。

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

xna - XNA ハードウェアのインスタンス化 - icosphere で顔が間違った順序で描画される

InstancedModelSample コードを自分のゲームに実装しようとしていますが、1 つの問題を除いて完全に機能しています - 私の icospheres のエッジが間違った頂点の間に描画され、文字化けした混乱を描画しているだけです。

個々の Draw() 呼び出しで 300 ほどのモデルを描画していたときは、正常にレンダリングされましたが、この新しいコードではそうではありませんでした。私はこのようなことは初めてです - これが何にでも使える一般的な方法のように見える場合、どのようにして顔で正しいギャップを埋める方法を取得できますか?

以下の私のコードは、元のサンプルからわずかに調整されているだけで、私には必要のない部分 (骨の変換など) が除外されています。



私を助けてくれる人に前もって感謝します:)

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

opengl - 選択した VAO のインスタンスを描画する (glDrawArraysInstanced)

glDrawArraysInstanced を使用して、ツリーの複数のインスタンスを異なる位置に描画し、フォレストを生成しています。

選択したインスタンスを描画する方法はありますか? 例: 異なる属性を持つ 100 本の木を取得しました。カリングのため、インスタンス 3、65、89、および 95 のみを描画します。

単一のインスタンスを描画できれば、すでに十分です。

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

ios - CAReplicatorLayer を使用せずに UIView の複数のインスタンスを描画するにはどうすればよいですか?

UIView があり、画面のさまざまなポイントに配置できる複数のレプリカを作成したいと考えています。また、各レプリカに異なるマスク/変換を適用できるようにして、それぞれがオリジナルの異なる部分を表示できるようにしたいと考えています。

たとえば、ビュー があり、そのAレプリカ 、 、および を 2 つ作成するBとしCます。次にB、 の上半分のみを表示するようにマスクを適用し、 の下半分のみを表示するようにA別のマスクを適用したいと考えています。CA

どうすればこれを行うことができますか?

CAReplicatorLayer は、レプリカがビュー階層の異なる部分にある必要があるため、アプリケーションで実行しようとしていることに実際には使用できません。また、元のビューにはアニメーション コンテンツやビデオが含まれている可能性があるため、スナップショットを利用する方法は使用できません。私が本当に欲しいのは、まったく同じように見える 2 つのビューを作成できるように、別のビューの内容をミラーリングできるある種のビューです。

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

opengl - OpenGL でのインスタンスベースの VR レンダリング

インスタンス化を使用して、1 つのドローコール、2 つのインスタンス (左目用、右目用) で OpenGL で VR レンダリングを実行しようとしています。頂点シェーダーは次に、instanceID 0 の場合は頂点を左に、instanceID 1 の場合は右に変換します。さらに必要なのは、自動ハードウェア カリング/クリッピング用のインスタンスごとのビューポートだけです。これは directX で実行可能ですが、OpenGL では可能ですか?