お世話になっております。
表題の件について、RVTのフィードバックは同一マテリアルで複数のRVTをサンプルする際に共有されますでしょうか?
以下に例を示します。
■RVT Main(BaseColor、Specular、Roughness、Normal、Mask)
のサンプル時(「Runtime Virtual Texture Sample」ノード)に正しいミップレベルが選択されるように「Enable Feedback」の設定をオンにしています。
複数のRVT間でフィードバックが共有されるのであれば
例えば同じマテリアル内で、別RVTである
■RVT Height
■RVT Mask4
をサンプルする際に「Enable Feedback」をオフにして「Mip Level」を0にすることで、
挙動を変えずにフィードバック負荷とVTのプール消費量を抑えることができると思いますが、この認識が合っているかどうか知りたいです。
また、フィードバックがRVTごとに独立して行う必要があるのであれば、どのような単位で管理されているかについても教えていただきたいです。
例えば、「Runtime Virtual Texture Sample」ノードごとであるとか、「Runtime Virtual Texture Volume」ごとなど。
以上、ご確認をよろしくお願いいたします。
お世話になっております。
本件の挙動に関しまして現在社内で確認させて頂いております。
お時間を頂き恐縮ですが今しばらくお待ちいただけますと幸いです。
よろしくお願いいたします。
ご返答ありがとうございます。
・FeedbackはRVT毎に1つという想定である(他のRVTのFeedback結果は参照できない)
・RVT内で複数テクスチャを使用している場合(BaseColor_Normal_Specular_Mask_YCoCgなど)は同一Feedbackになる
・Feedbackについては時間的、空間的に分散されて最適化されている
ということ承知いたしました。
-------
関連した質問になるのですが、
RVTをフェッチせずにFeedbackだけ行うことは可能でしょうか?
また、それによってメモリ・処理負荷削減になりますか?
例えば、こちらの投稿と同じように頂点シェーダーでRVTをフェッチする場合、
[Content removed]
Feedbackは頂点シェーダーのステージから送られないということなので、
ピクセルシェーダーのステージで RVTを再度フェッチすることによって、Feedback を強制するというやり方があるかと思います。
このような場合はピクセルシェーダーでは実際にRVTフェッチを行いたい訳ではないため、Feedbackだけ行うことができるかどうかが知りたいです。
お世話になっております。
本件ですが、確認したところRVTのフィードバックはRVT毎に1つ以上フィードバックを取得することを想定しており、Enable FeedbackフラグをDisableにするケースとしては、別のマテリアルで既にフィードバック処理が有効なRVTを取得する場合に”Mip Level”指定で0を指定することで読み込み済みのRVTを使用するといった運用を行っているようです。
例:Landscapeに配置している草にてEnable FeedbackをDisabeにしたサンプルノードでRVTテクスチャを利用する等
今回同一マテリアルで複数のRVTを読み込む場合に最適化ができないか?、といったご指摘かと思われますが、こちらは時間と空間で分散を行っているため十分という認識です。
フィードバックの書き込みは、FeedbackFactorによって解像度を下げBasePassでUAVに書き込みを行っていますが、この時FrameIndexや位置によるオフセットで分散を行っています。
以下InitializeVirtualTextureFeedbackで初期化を行っているRequestIdが一致する1つのリクエストのみをフィードバックとして格納しており、どのVTで、どのMipLevelがほしいといったFeedback(リクエスト)が集計され、物理のVirtualTextureに必要な部分がレンダリングされるため各テクスチャ毎に記録しています。
/** Initializes the FVirtualTextureFeedbackParams for the pixel shader. */
void InitializeVirtualTextureFeedback(in out FVirtualTextureFeedbackParams Params, uint2 SvPosition, uint FrameNumber) { #if (NUM_VIRTUALTEXTURE_FEEDBACK_REQUESTS + LIGHTMAP_VT_ENABLED) > 1 const uint NumVTSamplesInShader = NUM_VIRTUALTEXTURE_FEEDBACK_REQUESTS + LIGHTMAP_VT_ENABLED; const uint2 PixelPos = SvPosition >> View.VirtualTextureFeedbackShift; const uint FeedbackPos = PixelPos.y * View.VirtualTextureFeedbackStride + PixelPos.x; Params.RequestId = (View.VirtualTextureFeedbackSampleOffset + FeedbackPos) % NumVTSamplesInShader; Params.Request = 0xFFFFFFFF; #else Params.Request = 0xFFFFFFFF; #endif }
※RVTの中で複数のテクスチャを使われている場合、Layerという単位で管理して同一のフィードバックで管理しているようです。
こちらの中を見る場合は以下のLayerCount関数を検索して頂くと関連実装を見ることが可能です。
int32 URuntimeVirtualTexture::GetLayerCount(ERuntimeVirtualTextureMaterialType InMaterialType)
詳しい内容を確認したい場合は上記実装箇所等を参考にご確認いただけますと幸いです。
よろしくお願いいたします。
お世話になっております。
本件確認にお時間を頂いており申し訳ございません。
該当スレッドのようにPS側でVTSampleを用意することでFeedback処理を実行することは可能ですが、Feedback処理のみを行う設定等は用意できていないため、実現したい場合は独自で対応頂く必要が出てくるかと思われます。
また弊社内でこの部分を最適化した事例は持ち合わせていないため、現状どれだけ効果があるか確認できていない状態です。
エンジン改造が必要となってしまう見込みのため、まずはダミーのTextureSampleを利用する方法でパフォーマンスが許容できないかご確認いただけますと幸いです。