簡體   English   中英

片段着色器中的“交錯渲染”

[英]"Interleaved rendering" in fragment shader

PS 是的,我在 Computer Graphics Stack Exchange 上發布了這個問題 但是發帖也是希望更多人看到

介紹

我正在嘗試渲染多通道圖像(超過 4 個通道,目的是將其提供給神經網絡)。 由於 OpenGL 本身不支持它,我有多個 4 通道渲染緩沖區,我將通道的相應部分渲染到其中。

例如,我需要大小為512 x 512 x 16多通道圖像,在 OpenGL 中我有 4 個大小為512 x 512 x 4渲染緩沖區。 現在的問題是神經網絡需要步長為512 x 512 x 16 ,即一個像素的 16 個通道值后面跟着來自下一個像素的 16 個通道值。 但是目前我可以通過 4 次調用glReadPixels有效地讀取我的 4 個渲染緩沖區,基本上使數據具有4 x 512 x 512 x 4步幅。 在客戶端手動重新排序數據對我來說不夠的,因為它太慢了。

主要問題

我有一個想法渲染到大小為512*4 x 512 x 4的單個 4 通道渲染緩沖區,因為它相當於512 x 512 x 16 ,我們只處理連續 4 個像素的組合作為 16 通道輸出圖像的單個像素。 我們稱之為“交錯渲染”

但這需要我神奇地調整我的片段着色器,以便每組后續的 4 個片段將具有完全相同的頂點屬性插值。 有沒有辦法做到這一點?

這個帶有 1 個1024 x 512 4 通道圖像渲染緩沖區的糟糕插圖是它應該如何渲染的一個例子。 這樣我就可以在 1 次調用glReadPixels512 x 512 x 8步幅提取數據在此處輸入圖片說明

編輯:更好的圖片我現在擁有的(4 個渲染緩沖區) 在此處輸入圖片說明

我想在 OpenGL 中本地做的事情(此圖像是在 Python 離線中完成的) 在此處輸入圖片說明

但這需要我神奇地調整我的片段着色器,以便每組后續的 4 個片段將具有完全相同的頂點屬性插值。

不,它需要的遠不止這些。 您必須從根本上改變光柵化的工作方式。

以 4 倍寬度渲染就是以 4 倍寬度渲染。 這意味着相對於正方形區域拉伸生成的圖元。 但這不是你想要的效果。 您需要光柵化器以原始分辨率進行光柵化,然后復制光柵化產品。

那是不可能的。

來自評論:

它只是讓我想到,我可以嘗試從頂點 + 片段着色器獲得 512 x 512 x 2 的紋理坐標圖像,然后將其與自身縫合以使其寬度增加 4 倍(因此我們將獲得相同的插值)並從形成最終圖像

這是一個好主意。 您需要將所需的任何內插值渲染到原始大小的紋理,類似於延遲渲染的工作方式。 所以它可能不僅僅是 2 個值。 您可以只存儲gl_FragCoord.xy值,然后使用它們來計算您需要的任何值,但直接存儲內插值可能更容易。

我建議在讀取紋理時執行texelFetch ,因為您可以指定精確的整數 texel 坐標。 您需要的整數坐標可以從gl_FragCoord計算如下:

ivec2 texCoords = ivec2(int(gl_FragCoord.x * 0.25f), int(gl_FragCoord.y));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM