RT.
據紅寶書描述: 在一個片元著色器中同時寫入到多個緩沖中的技術叫MRT渲染. 這通常是一種性能的優化方案, 可以避免因為多次處理同一組頂點串列而浪費時間, 并且不需要多次對同樣的圖元進行光柵化.
我在網上查找相關實作的時候, 發現大家在應用MRT技術時, 都會先申請一個FBO.
我現在想在默認的FBO中應用MRT技術.
// 申請紋理緩沖區, 對應附件點為GL_COLOR_ATTACHMENT1. (GL_COLOR_ATTACHMENT0預留給螢屏顯示用)
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &m_pickingColorTexture);
glBindTexture(GL_TEXTURE_2D, m_pickingColorTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, w, h, 0, GL_RGB, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_pickingColorTexture, 0);
glDisable(GL_TEXTURE_2D);
// 繪制代碼. 設定同時寫入GL_COLOR_ATTACHMENT0和GL_COLOR_ATTACHMENT1
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
glDrawElements(........);
// 片元著色器
.......
layout (location = 0) out vec4 frag_color0;
layout (location = 1) out vec4 frag_color1;
void main() {
frag_color0 = vec4(1.0);
frag_color1 = vec4(0.5);
}
// 查詢結果
glReadBuffer(GL_COLOR_ATTACHMENT1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, &pixelInfo);
代碼大致結構如上所示. 最后去查詢GL_COLOR_ATTACHMENT1緩沖區中的內容時, 發現并不是frag_color1中設定的顏色, 而是frag_color0的顏色.
我嘗試過額外申請FBO來做這件事, 是可以的. 但是換了默認的FBO就不行. 但額外申請FBO的話, 就需要繪制兩次模型, 會影響性能. 這跟MRT技術的本意似乎不符合.
希望有大佬能幫忙解惑, 謝謝~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271664.html
標籤:其它技術問題
上一篇:【求助】obs-studio專案編譯時,不識別iso_volatile_load32
下一篇:來個大佬幫忙
