2017-08-08 96 views
1

我創建了一個FBO並將紋理綁定爲其顏色附件,並且我有多個着色器程序對紋理進行一些後期處理,所有內容效果很好,但對我來說紋理可以用作輸入(sampler2D)以及着色器同時輸出是沒有意義的。紋理同時用作着色器程序的FBO顏色附件和sampler2D

以下是我所採取的步驟:

  1. 創建FBO fboA
  2. 創建紋理textureA,並將其綁定爲fboA的顏色附件。
  3. 調用glBindFrameBufferfboA綁定到幀緩衝區目標。使用着色器程序shaderA
  4. 致電glDrawArrays繪製一些東西(最終繪製在textureA上,因爲fboA目前已綁定)。
  5. 致電glUseProgram使用着色器程序shaderB其在片段着色器中具有sampler2D制服。
  6. 綁定textureA作爲sampler2D統一着色器程序shaderB
  7. 在片段着色器中,textureA用於設置fragColor

我感到困惑的是最後兩個步驟,其中textureA作爲片段着色器的輸入,它仍然被綁定到當前幀緩存。在我看來,片段着色器正在讀取和寫入同一片內存,這不是一種未定義的行爲,爲什麼它仍然正常工作?

回答

5

是不是這種某種未定義的行爲,爲什麼它仍然正常工作?

因爲「undefined behavior」並不排除行爲似乎可以「正常工作」的可能性。 UB意思是任何東西都可能發生,包括你實際想要發生的事情。

當然,明天可能會突然停止「工作」。或者當你把你的代碼放到不同的GPU上。或者如果你開始渲染更多的東西。或者,如果你真的很難在你的電腦上呼吸。

未定義的行爲是undefined

如果您想使其定義明確,那麼您需要使用texture barrier功能並遵守其規則:不超過一次讀/修改/寫障礙之間的每片段,或者只讀取和寫入不同的片段。

+0

謝謝,正是我想知道的。此外,我只是指向[反饋循環](https://www.khronos.org/opengl/wiki/Framebuffer_Object#Feedback_Loops)。 – neevek

相關問題