問題タブ [raymarching]
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.
algorithm - 複数のレイマーチング サンプルの統合
フィールド関数をレンダリングするためにレイマーチングを使用しているとしましょう。(これは GPU ではなく CPU で行われます。) 私はこの大まかに書かれた疑似コードのようなアルゴリズムを持っています:
ロジックはすべて非常に単純です...しかし、どのように機能integrate()
するのでしょうか?
各サンプルは、サンプルがポイントで取得されたとしても、ポイントではなく、実際には私のフィールド内のボリュームを表します。したがって、最終的なピクセル カラーへの影響は、ボリュームのサイズによって異なります。
これを行う方法がわかりません。私は周りを見回しましたが、それを行う多くのコードを見つけましたが (通常は Shadertoy で)、すべての方法が異なり、理由の説明が見つかりません。これはどのように機能するのでしょうか? さらに重要なのは、Google で検索できる魔法の検索用語を教えてください。
three.js - ボリューム レンダリングは、ある方向から別の方向へより透過的です
three.js とレイ マーチング GLSL を使用して、ボリューム レンダリングについて理解を深めようとしています。numpy 配列から合成したデータがあります。
レンダリングされているデータの立方体は、片側がより不透明で、反対側が徐々に透明になります - このように (ワイヤ フレームは無視してください。これはちょっとした方向付けのためです)
ただし、透明度の高い端から立方体を見ると、透明度が透明度の低い端を「ブロックアウト」しているように見えます (意味があることを願っています)。このような:
これが関係しているかどうかはわかりませんが、カメラが立方体の少し内側に入ると、正しくレンダリングされなくなるという問題もあります。次のように、カメラに最も近いビットを切り取ります。
これは関連する問題ですか、それとも方法の制限にすぎませんか。
コードはこちら https://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.htmlhttps://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.js https://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.html ://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.html
2 番目のパス シェーダーは次のようになります。
よろしくお願いします
編集:少し実験した後、立方体の外側だけがレンダリングされていることが問題のようです。立方体の真ん中にデータの塊を置いても、何も見えません。
EDIT:実際には、前面の唯一のレンダリングデータです。レイ マーチングの方向を逆にすると (つまり、カメラに向かう方向に変更すると)、裏側の表面でしか見ることができません。
algorithm - 動的に一様な方法で Revelles アルゴリズムを使用して octree をトラバースする GLSL
GLSL (v450) のコンピューティング シェーダーで、リアルタイムのレイ マーチングを使用するレベル アルゴリズムを使用して、octree をトラバースしようとしています。私はなんとかそれを横断し、画像を取得しましたが、私の fps は非常に低く、約 0 ~ 5 fps です。アルゴリズムの疑似コードは再帰的なものなので、スタックを使用してループに変換しました (GLSL では再帰が許可されていないため)。問題は、このループを動的に均一にしないとすぐに、約 30 ~ 40 のこの巨大な fps 低下が発生することです。
スタックで共有属性を使用すると、この fps を元に戻すことができます。これは、グローバル変数の計算シェーダーでのみ使用できます。
ワークグループ内のすべてのスレッド間で共有および使用できるようにします。問題は、ループを動的に均一にする必要があるように見えるため、これらをbarrier()および/またはmemoryBarrierShared()関数と同期できないことです (共有変数の下を参照してください www.opengl.org/wiki/Compute_Shader)。同期できないため、画像がピクセル化されてちらつきます。
このアルゴリズムを動的に均一なループに変換する方法はありますか? ループが動的に均一でなくなると fps が低下するのはなぜですか?
以下は、メインループの私のコードです。
geometry - GLSL立方体符号付き距離場の実装説明?
私は次のコードを見て理解しようとしています
length(d)
ポイントが「コーナー」から外れている(つまり、のすべてのコンポーネントd
が正である) SDF ケースを処理し、max(d.x, d.y, d.z)
他のすべてのケースで適切な距離を与えることを理解しています。私が理解できないのは、ここで if ステートメントを使用せずにこれら 2 つを組み合わせてd
のコンポーネントの符号をチェックする方法です。
すべてのd
コンポーネントが正の場合、戻り式はが評価されるlength(d)
方法によりに減らすことができ、すべてのコンポーネントが負の場合は を取得します。しかし、その中間のケースをどのように理解すればよいのでしょうか? のコンポーネントが混合記号を持っているものは?min/max
d
max(d.x, d.y, d.z)
d
私は無駄にそれをグラフ化しようとしてきました。誰かがこれを幾何学的/数学的な用語で説明してくれたら本当にありがたいです. ありがとう。
c - レイマーチング用のベクトルを計算するときに魚眼の歪みを除去
レイマーチング用の opencl カーネルを作成しようとしています。次の例に示すように、結果の画像に顕著な魚眼の歪みがあることを除いて、すべてが機能します: (これは立方体であると想定されています)
問題は、各光線の方向ベクトルを構築する方法にあります。
現在、私はカーネルにカメラの方向をピッチとヨーとして与えています(私のコードでは)pitch
。yaw
次に、fov ( fov
)、カーネルが計算しているピクセルの座標 (ix
およびiy
)、およびフレーム全体の幅と高さ( width
、 )height
に基づいて、光線の方向のピッチとヨーを取得します。
最後に、前の計算で得られたピッチとヨーを使用して単位ベクトルを作成します。
(varfloat
カーネルが double または single 浮動小数点精度で実行されているかどうかに応じて、float または double のいずれかを表します)
上の画像では、fov
は Pi/3 で、width
とheight
は両方とも 500 でした。
歪みをなくすために方向ベクトルのピッチとヨーを計算する方法を教えてもらえますか?