問題タブ [culling]
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.
opengl - OpenGL インスタンス化レンダリング - 錐台カリング
glDrawElementsInstanced() を使用して、大量の立方体 (100 000 以上) を描画しています。パフォーマンス上の理由から、フラスタム カリングを実装したいと考えていますが、インスタンス化を使用しているときにそれを行う方法がよくわかりません。私が知る限り、オブジェクトの個々のインスタンスにアクセスする唯一の方法はシェーダーにあるため、そこでカリングを行う必要があると思います。その方法がよくわかりません。誰でもチュートリアルを教えてもらえますか?
c++ - 錐台の属性を適切に計算していますか?
基本的なカメラ クラスがあり、次の注目すべき機能があります。
関数内の paramszn
とは、それぞれニア クリップ プレーンとファー クリップ プレーンの距離に対応します。zf
SetLens
SetLens
基本的に遠近両方のクリップ プレーンの高さを計算すると共に、透視投影マトリックスを作成します。
したがって、GetFarWindowHeight()
当然GetNearWindowHeight()
、それぞれの高さクラスのメンバー値を返します。ただし、対応する幅は、それぞれの高さの値にビューの縦横比を掛けた値を返します。したがって、次の場合GetNearWindowWidth()
:
Whereは同じ計算を実行しGetFarWindowWidth()
ますが、もちろん に置き換えます。mNearWindowHeight
mFarWindowHeight
これで問題は解決しましたが、ニア クリップ プレーンとファー クリップ プレーンの高さと幅を正しく計算していないことがわかりました。特に、この混乱の原因は、y 軸の視野を度単位で指定し、それを正接関数でラジアンに変換しているという事実だと思います。これが問題を引き起こしていると思われる場所は、近くの平面と遠い平面の幅/高さを使用して、上、右、左、および下の平面のポイントも取得する錐台カリング関数にあります。
それで、私はこれを完全に間違っているという点で正しいですか?もしそうなら、私はそれを修正するために何をすべきですか?
免責事項
このコードはもともと D3D11 の本に由来するもので、読むのをやめて OpenGL に戻ることにしました。プロセスの負担を軽減するために、元のコードの一部をより OpenGL に準拠するように変換するとよいと考えました。これまでのところ、この 1 つの小さな問題を除いて、かなりうまく機能しています...
編集
最初にいくつかのことを言及する必要がありました。
OpenGL を使用するのはこれが初めてではありません。GL と D3D の座標系の違いだけでなく、変換プロセスもよく知っています。
これは私のカメラクラス全体ではありませんが、このコンテキストで疑わしいと思われる他の唯一のことは、カメラの行列
mOrientation
を使用して、+x、+y でそれぞれを変換することにより、ルック、アップ、右方向のベクトルを計算することです。 、および -z 基準、それぞれ。したがって、例として、ルック ベクトルを計算するには: を実行しmOrientation * vec4(0.0f, 0.0f, -1.0f, 1.0f)
、それを に変換しvec3
ます。ここで言及しているコンテキストには、これらの基底ベクトルを錐台のカリングと組み合わせて使用する方法が含まれます。
c++ - 特定の角度でフラスタム カリングがカリングされないのはなぜですか?
錐台カリングの実装が正しく機能していません。カメラを左に回転させるとカリングされますが、右には回転しません。また、カメラを後方に移動すると「カリング」されますが、オブジェクトが消えてレンダリングされない距離は非常に短いです6.0f
が、オブジェクトの中心 (球体) とカメラの位置を使用するときの単位についてです。距離を計算します。上下の移動/回転は、実際には何もしません。
私の投影遠平面は高いです: 500.0f
、私の近平面は0.1f
です。確かに、ファープレーンを下げたり上げたりしても、カリングには実際には影響しないようです。
コード
平面計算コードは次のとおりです。
簡単に言えば、ファー クリップ プレーンとニア クリップ プレーンの中心が最初に計算され、次に両方の錐台側の 4 つのコーナーが計算され、次のようにplanes
配列内のポイント設定が可能になります。planes
配列は、錐台の 6 つの側面を参照するために使用されます。
M_ComputePlane
平面の法線と原点までの距離を計算しますd
。
実行された交差テストは次のとおりです。それぞれがテストされ、基本的に同じ結果が得られます。
3d - DirectX は巻き上げ順序をどのように決定しますか?
DirectX はどのようにポリゴンの巻き順を決定しますか? 特に背面カリングに興味があります。これを調査したところ、DX がサーフェス法線を計算し、それとカメラ ベクトルの内積を取り、それが > 0 の場合はカリングすることが示唆されました。
まず、これは DirectX が実際に採用している手法ですか? 第 2 に、この場合、すべてのサーフェスに 2 つの法線 (一方は他方と反対) があるとすると、DirectX はどの法線を使用するかをどのように判断するのでしょうか?