簡體   English   中英

Opengl和Webgl:從附加到當前幀緩沖區的紋理采樣

[英]Opengl and Webgl: sampling from a texture attached to current framebuffer

我有一個帶有兩個貼圖t0t1的幀緩沖區。

在第一遍中,我使用多個片段着色器輸出對它們兩者進行渲染。

在第二遍之前,我需要執行以下操作:

  • 打開僅具有一個輸出的着色器
  • t1綁定到紋理單元
  • 調用glDrawBuffers禁用寫入t1的附件

請注意, t1用於采樣,但仍綁定到當前幀緩沖區。 據我了解,這種配置沒有環回。

在OpenGL和WebGL中都合法嗎?

了一個可以在Linux下的Chrome和Firefox中完美運行的示例 ,但在兩個Windows瀏覽器中都呈現了黑屏。 是在D3D支持的Webgl實現中的原因,以及它在此處指出的激進紋理解除綁定的原因嗎?

據我了解,這種配置沒有環回。

但是有一個。

在GL 4.5之前的版本(包括WebGL)中,只要您從當前連接到幀緩沖區的紋理讀取內容,就會發生反饋循環 如果您現在不寫它,沒關系。 現在不能寫它沒關系。 只要將它附加到幀緩沖區,就可以通過對其進行讀取獲得未定義的行為(除非它們是從未附加的mipmap級別讀取的)。

post-GL 4.5包括WebGL)中或具有紋理屏障擴展的情況下,此操作很輕松。 但是還不足以解決您的問題。 當您嘗試從仍附加到幀緩沖區的圖像中讀取上一次調用中寫入的像素時,仍會觸發UB。

因此,您必須更改FBO以便不再附加圖像,或者必須發出紋理屏障(如果可以訪問4.5 / ARB / NV_texture_barrier,則可以在桌面GL上執行此操作)。

在WebGL1和WebGL2中這都是非法的。 如果存在反饋循環,則需要WebGL生成INVALID_OPERATION錯誤。

從規范第6.25節開始

6.25紋理和幀緩沖區之間的反饋循環

在OpenGL ES 2.0 API中,可以進行寫入和讀取相同紋理的調用,從而創建反饋循環。 它指定存在這些反饋循環的位置會導致未定義的行為。

在WebGL API中,將導致此類反饋循環(根據OpenGL ES 2.0規范中的定義)的此類操作將生成INVALID_OPERATION錯誤。

正如您所指出的,聽起來您的情況似乎沒有實際的反饋回路,但是正如Nicol根據規范指出的那樣,仍然存在。 Chrome和Firefox似乎都是一個錯誤

暫無
暫無

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

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