GLSLパックがRGBAテクスチャに浮かび上がる


8

従来の三角形ベースのモデルとパーティクルを、適度なフレームレートでレイトレースされたシーンで構成したいと考えています。

webGLではgl_FragDepth、フラグメントシェーダーでを記述できません。複数のレンダーターゲットを持つことはできませんが、RGBAテクスチャにレンダーしてから、そのテクスチャを別の描画操作への入力として使用できます。そのため、レイトレースされたシーンをレンダリングし、次のステージへの入力として深度を保存できます。これは明らかに理想からかけ離れていますが、実行可能です。

私はこれについて誤解したいのですが、これは決定的なソースではなく試行錯誤から集められたものです。欠陥のある仮定を修正してください

GLSLフラグメントシェーダーで、フロートおよび理想的にはいくつかのフラグビットなどをRGBAテクスチャに効率的にパック/アンパックするにはどうすればよいですか?


2
最初のGPU Gemsブックには、シャドウマッピングに関する古い記事があります(ここで読むことができます:http.developer.nvidia.com/GPUGems/gpugems_ch12.html)。フロートをRGBAテクスチャにパックする方法を2つの異なる方法で説明します。書き込みについてはセクション12.3.3、読み取りについては12.3.6を参照してください。
ベンリッツ

1
役立つ可能性のある別のリソースは、UnityのAras Pによる記事「小さなGバッファー用のコンパクトな通常のストレージ」(aras-p.info/texts/CompactNormalStorage.html)です。この記事は法線のみに限定されています。
Mortennobel

1
R32Fテクスチャを作成し、そこに深度値を書き込むだけです。梱包はありません。次に、2回目の「従来の三角形ベースの」パスで、このテクスチャを深度バッファとして使用します(深度としてFBOにアタッチされます)。これが明確でない場合は、遠慮なく質問してください。
alariq 2013年

@alariqはい、float拡張機能が広くサポートされるようになりました。
2013年

@Will float拡張機能で問題が解決した場合は、回答として投稿して受け入れます。
Polar

回答:


5

WebGLおよびOpenGL ES 2.0で機能するパック関数とアンパック関数は次のとおりです。これは0 ... 1の範囲の値のみを対象とするため、深度計算は正しいスペースで行う必要があります。

フロートをRGBAにエンコードする


答えにコードスニペットを追加できますか?あなたが言及したサイトがダウンした場合、リンクは役に立たないでしょう。
フェリペグティエレス2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.