我有 2 個 FBO + MRT,它們有相同的附件(每個附件 4 個顏色)。使用 glBlitFrameBuffer 對深度緩沖區和一個顏色附件按預期工作。但是,當我使用多種顏色的附件時,事情就變糟了。我做了很多研究,嘗試了很多不同的方法,都沒有奏效。我沒有使用 renderBufferStorage,因為我的紋理具有不同的內部格式(RGBA 和 RGB16F)。這聽起來像一個類似的問題,除了我沒有使用多重采樣,只使用 MRT。OpenGL 4.3 版原因:我想創建地形預照明計算的狀態,這樣我只需要在有變化(即相機移動)時渲染地形,然后將這些顏色附件復制到下一個 FBO。這是用于延遲著色的,FBO 與 gBuffer 非常相似。起初我希望我應該使用我在初始設置中使用的 glDrawBuffers,但是沒有 glReadBuffers,因此我假設我無法鏈接它們。我可能在這里錯了,還不是專家=)原始代碼是用 Golang 編寫的,應該可以很容易地轉換為 C++(如果需要,將進行翻譯)。更新/已解決:對于遇到此問題的任何人。當您使用 glDrawBuffers() 并調用 glDrawBuffer() 時,您將覆蓋 glDrawBuffers() 狀態。它需要重置為其原始 glDrawBuffers() 狀態。更新 2:對于那些對這種方法感興趣的人,我可以確認它具有令人難以置信的性能結果,如果您有一個非動畫世界并且相機不經常移動。就我的目的而言,它很棒(RTS),但對于像 CS 這樣的 FPS 游戲來說,這將是一個非常糟糕的方法。在 blitting 之后添加以下內容(特定于案例):var attachments = [4]uint32{gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2, gl.COLOR_ATTACHMENT3}gl.DrawBuffers(4, &attachments[0])FBO 設置gl.GenFramebuffers(1, &fbo.ID)gl.BindFramebuffer(gl.FRAMEBUFFER, fbo.ID)//setting up color attachmentsgl.GenTextures(1, &fbo.Position)gl.BindTexture(gl.TEXTURE_2D, fbo.Position)gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB16F, windowWidth, windowHeight, 0, gl.RGB, gl.FLOAT, nil)gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, fbo.Position, 0)//repeated 3 times for the additional color attachmentsvar attachments = [4]uint32{gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2, gl.COLOR_ATTACHMENT3}gl.DrawBuffers(4, &attachments[0])gl.GenRenderbuffers(1, &fbo.DepthBuffer)gl.BindRenderbuffer(gl.RENDERBUFFER, fbo.DepthBuffer)gl.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT, windowWidth, windowHeight)gl.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, fbo.DepthBuffer)gl.BindFramebuffer(gl.FRAMEBUFFER, 0)
1 回答

茅侃侃
TA貢獻1842條經驗 獲得超21個贊
glDrawBuffer(x)
在概念上等同于調用GLenum bufs[1]={x}; glDrawBuffers(1, bufs)
。由于繪圖緩沖區狀態是 FBO 狀態的一部分,因此您的 blitting 代碼會覆蓋這些狀態,如果未手動恢復這些狀態,則之后的渲染將無法按預期工作。如果你在一個循環中調用它,這可能會導致錯誤的結論是 blitting 是問題,但實際上,blitting 工作正常,只是在錯誤的輸入數據上。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消