亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Blitting FBO 顏色附件

Blitting FBO 顏色附件

Go
翻過高山走不出你 2023-08-14 17:30:37
我有 2 個 FBO + MRT,它們有相同的附件(每個有 4 個顏色附件)。對于深度緩沖區和一個color_attachment,使用 glBlitFrameBuffer 可以按預期工作。然而,當我位塊復制多個顏色附件時,事情就會變糟。我做了很多研究,嘗試了很多不同的方法,但沒有一個有效。我沒有使用 renderBufferStorage,因為我的紋理具有不同的內部格式(RGBA 和 RGB16F)。這聽起來像是一個類似的問題,但我不使用多重采樣,只使用 MRT。OpenGL 版本 4.3原因:我想創建地形預照明計算的狀態,這樣我只需要在發生變化(即相機移動)時渲染地形,然后將這些顏色附件復制到下一個 FBO。這是為了延遲著色,FBO 與 gBuffer 非常相似。起初,我希望我應該使用在初始設置中使用的 glDrawBuffers,但是沒有 glReadBuffers,因此我假設我無法鏈接它們。我可能錯了,還不是專家=)原始代碼是用 Golang 編寫的,應該可以輕松轉移到 C++(如果需要,將進行翻譯)。更新/已解決:對于任何偶然發現此問題的人。當您使用 glDrawBuffers() 并使用對 glDrawBuffer() 的調用時,您將覆蓋 glDrawBuffers() 狀態。它需要重置為其原始 glDrawBuffers() 狀態。更新2:對于那些對這樣的方法感興趣的人,如果你有一個非動畫世界并且相機不經常移動,我可以確認它具有令人難以置信的性能結果。就我的目的而言,它很棒(RTS),但對于像 CS 這樣的 FPS 游戲來說,這將是一個非常糟糕的方法。在位塊傳輸后添加以下內容(具體情況而定):var attachments = [4]uint32{gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2, gl.COLOR_ATTACHMENT3}gl.DrawBuffers(4, &attachments[0])固定基地運營基地設置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貢獻1847條經驗 獲得超11個贊

glDrawBuffer(x)在概念上等同于調用GLenum bufs[1]={x}; glDrawBuffers(1, bufs). 由于繪制緩沖區狀態是 FBO 狀態的一部分,因此您的位圖傳輸代碼會覆蓋這些狀態,如果不手動恢復這些狀態,則之后的渲染將無法按預期進行。如果你在循環中調用它,這可能會導致錯誤的結論,即位圖傳輸是問題所在,但實際上,位圖傳輸工作正常,只是在錯誤的輸入數據上。



查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號