2012-06-08 87 views
3

我已經在下面的方式創建一個FBO時夾緊:精度低和寫入浮點FBO

glGenRenderbuffers(1, &m_depthStencilBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, m_width, m_height); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 

glGenTextures(1, &m_texture); 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_texture); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, m_width, m_height, 0, GL_RGBA, GL_FLOAT, 0); 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); 

glGenFramebuffers(1, &m_frameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, m_texture, 0); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer); 
assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
assert(GL_NO_ERROR == glGetError()); 

我再渲染這與這個最小的片斷程序:

void main() { 
    gl_FragColor = float4(3.001001f, 2.00002f, 7.00003f, 4.00004f); 
} 

如果我讀出這樣的像素:

glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &pixels[0]); 

,並檢查由上述片段程序噸寫入的像素嘿(1,1,1,1)。我只是爲測試目的添加了glReadPixels,如果我嘗試在另一個片段程序中使用textureRect來嘗試對FBO進行採樣,我會遇到同樣的問題。

回答

2

問題是我的一個愚蠢的錯誤,在我的FBO調整大小的代碼,我叫:

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, ...); 

,而不是

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, ...); 
4

是的,它將被限制在範圍(0,1) - 檢查出glClampColor並禁用色彩鉗位。

希望這會有所幫助!

+0

它不應該適用於抽樣浮點紋理,雖然(如OP所述)。 –

+1

它適用於glReadPixels AFAIK。所以雖然結果可能不會在GPU上受到限制,但它們可能會在閱讀時受到限制。從文檔 「glClampColor控制在glReadPixels.target中執行的色彩夾緊必須爲GL_CLAMP_READ_COLOR如果夾具爲GL_TRUE,則啓用讀取色彩夾緊;如果夾具爲GL_FALSE,則禁用讀取色彩夾具;如果夾具爲GL_FIXED_ONLY,則讀取顏色只有當選定的讀緩衝區具有定點組件且禁用時才能使能鉗位。「 – Ani

+0

謝謝,我將在週一回去工作時檢查一下。 –