2009-10-17 26 views
1

这应该非常简单,但它耗时数小时,我不知道发生了什么。OpenGL with FBO RTT,当它不应该混合时

我正在渲染一个平面彩色全屏四边形到纹理,然后用glGetTexImage读回结果。它与GPGPU相关,所以我希望alpha值的行为就像其他三个一样。如果有问题,我使用FBO,纹理格式GL_RGBA32F_ARB,MacBook Pro上带有10.5的NVidia卡。

我只返回正确的颜色,如果我指定的alpha是1;与任何其他值似乎是与帧缓冲已经混合,即使我已明确禁用GL_BLEND。我也尝试启用混合并使用glBlendFunc(GL_ONE, GL_ZERO),但最终结果是相同的。我可以在渲染之前清除framebuffer为零,这可以修复它,但我想了解为什么这是必要的。作为第二个测试,渲染两个重叠的四边形给出了一个混合结果,当我只想要原来的4通道色彩时。当然,纯色四核应该完全覆盖帧缓冲区中的像素?我猜我误解了一些根本性的东西。谢谢。

const size_t res = 16; 
GLuint tex; 
glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, 
    res, res, 0, GL_RGBA, GL_FLOAT, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

GLuint fbo; 
glGenFramebuffersEXT(1, &fbo); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, 
    GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); 
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); 

glViewport(0, 0, res, res); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, res, 0, res, -1, 1); 

glClearColor(0,0,0,0); 
glClear(GL_COLOR_BUFFER_BIT); 

//glEnable(GL_BLEND); 
//glBlendFunc(GL_ONE, GL_ZERO); 
glDisable(GL_BLEND); 
glDisable(GL_DEPTH_TEST); 

glColor4f(0.2, 0.3, 0.4, 0.5); 

for (int i=0; i<2; ++i) { 
    glBegin(GL_QUADS); 
    glVertex2i(0,0); 
    glVertex2i(res, 0); 
    glVertex2i(res, res); 
    glVertex2i(0, res); 
    glEnd(); 
} 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

std::vector<float> tmp(res*res*4); 
glBindTexture(GL_TEXTURE_2D, tex); 
glGetTexImage(GL_TEXTURE_2D, 0, 
    GL_RGBA, GL_FLOAT, &tmp.front()); 
const float * const x = &tmp.front(); 
cerr << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl; 
// prints 0.3 0.45 0.6 0.75 

glDeleteTextures(1, &tex); 
glDeleteFramebuffersEXT(1, &fbo); 

回答

1

不是真的一个很好的答案,但是,需要注意以下几点:

  • 什么您看到的是并没有真正像混合。首先,你的后台缓冲区最初是rgba = 0,所以对它的alpha混合会给0,而不是0.2 0.3 0.4 0.5,就像你可能观察到的那样。
  • 我的倾向是你以某种方式设置纹理缓冲区纹理 framebuffer attachchement。这在规格(section 4.4.3)中未定义。在你提供的代码片段中,你可以做一个glBindTexture(GL_TEXTURE_2D, 0),这应该确保它不是这种情况......如果你错过了它,我会让它在这里。