問題タブ [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 - GLSL シェーダー: オクルージョンの順序とカリング
一連のベジエ曲線 (ポイントの 3D 座標) を指定して 3D 曲線を描画する GLSL シェーダーがあります。描画自体は、オクルージョンが正しく機能しないことを除いて、私が望むように行われます。つまり、特定の視点の下では、最前面にあるはずの曲線がまだオクルードされているように見え、逆: 想定されている曲線の部分閉塞することはまだ表示されます。
説明のために、スクリーンショットの例をいくつか示します。
1 - 色付きの曲線はカメラに近いため、ここでは正しくレンダリングされます。

2 - 色付きの曲線は灰色の曲線の後ろにあるはずですが、上にレンダリングされます。

私はGLSLに不慣れで、この種の効果の正しい用語を知らないかもしれませんが、オクルージョンカリングであると思います(更新:実際には深度バッファの問題、用語の混乱を示しています!)。私の質問は、GLSL シェーダーを使用するときにオクルージョンをどのように処理すればよいですか? それらをシェーダー プログラム内で処理する必要がありますか、それとも別の場所で処理する必要がありますか?
私のコードに関しては、少し長いですが (さらに OpenGL ラッパー ライブラリを使用しています)、主な手順は次のとおりです。
- 頂点シェーダーでは、
gl_Position = ModelViewProjectionMatrix * Vertex;さらに色情報を計算してジオメトリ シェーダーに渡します。 - ジオメトリ シェーダーでは、4 つのコントロール ポイント (
lines_adjacency) とそれらに対応する色を取得し、ベジェ曲線に従う三角形のストリップを生成します (ベジェ セグメント間で基本的な色補間を使用します)。 - フラグメント シェーダーも単純です
gl_FragColor = VertexIn.mColor;。
OpenGL の設定については、有効GL_DEPTH_TESTにしていますが、必要なものが何もないようです。また、シーンに他の非シェーダー ジオメトリ (クワッドなど) を配置すると、視点に関係なく、曲線は常にその上にレンダリングされます。
それを解決する方法と、なぜそれが起こっているのかについての洞察とヒントをいただければ幸いです。
ソリューションの更新
したがって、私が学んだ最初の問題は、カリングアルゴリズムを見つけることではなく、z 値の計算を正しく処理していないことでした (受け入れられた回答を参照)。また、適切な深度バッファーの設定があれば、OpenGL はそれ自体でオクルージョンを正しく処理するため、車輪を再発明する必要がないことも学びました。
GLSL プログラムを検索したところ、頂点座標を画面座標に変換するときに、基本的にジオメトリ シェーダーで Z 値をゼロに設定していることがわかりました ( vec2( vertex.xy / vertex.w ) * Viewport;)。Z値( )を個別に計算して修正し、vertex.z/vertex.wそれらを放出されたポイント( )に割り当てましたgl_Position = vec4( screenCoords[i], zValues[i], 1.0 );。それは私の問題を解決しました。
深度バッファの設定に関しては、使用するライブラリが必要に応じてデフォルトで正しく設定されているため、明示的に指定する必要はありませんでした。
java - JavaFX および Point3D での頂点ワインディング (背面カリング用) の決定
私は、JavaFX で結合された TriangularMesh として j3d GeometryArrays を表示しようとしています。受信している GeometryArray が TriangleStripArray であることはわかっています。この順序により、正しい面を構築し、シーンにメッシュを表示できます。
しかし、TriangleStripArray だけに基づいて頂点の巻き順を決定する方法に途方に暮れています。現在、面には背面カリングの正しい概念がなく、任意の角度から歪んで見える完全な TriangleMesh が残っています。CullFaceMode を BACK から NONE に変更し、シーン内の頂点をプロットすると、すべての面が正しくマッピングされていることがわかります。
3 つの頂点を含む特定の三角形の面から TriangleMesh を構築する 2 つの方法があります。
基本的に:
対
私の質問は、TriangleStripArray だけに基づいて、頂点のワインディング順序を決定する方法と、面ごとにどのメソッドを使用する必要があるかということです。(TexCoordinates が提供されていますが、使用されていません)
前もって感謝します!- R.メルヴィル