glGetTexImage使用FBO返回0

时间:2013-06-01 21:42:52

标签: c++ opengl graphics glsl shader

在得知我必须使用FBO从着色器读取浮点数据后,我尝试了这个但没有运气:

glGenTextures( 1, &renderTex );   
glBindTexture( GL_TEXTURE_2D, renderTex );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, GL_R32F, size, size, 0, GL_RED, GL_FLOAT, NULL );
glBindTexture( GL_TEXTURE_2D, 0 );

glGenFramebuffers( 1, &fbo );
glBindFramebuffer( GL_FRAMEBUFFER, fbo );

glGenRenderbuffers( 1, &depth );
glBindRenderbuffer( GL_RENDERBUFFER, depth );

glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT, size, size );
glBindRenderbuffer( GL_RENDERBUFFER, 0 );

glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTex, 0 );
glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth );

if ( !FBOStatusOK() ) return;

glBindFramebuffer(GL_FRAMEBUFFER, 0);

glBindFramebuffer( GL_READ_FRAMEBUFFER , m_FBO );
glClampColor( GL_CLAMP_READ_COLOR, GL_FALSE );

GLfloat* pixels = new GLfloat[size * size];
//glReadPixels also returns 0s
//glReadPixels( 0, 0, size, size, GL_RED,  GL_FLOAT, pixels );
glGetTexImage( GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, pixels );

pixelDataVector.resize( size * size );
for ( int i = 0; i < size * size; i++ )
{
  pixelDataVector[i] =  (float) pixels[i];
}

我的着色器代码:

out float data;

void main()
{  
  data = 0.02;
}

这将打印所有0。当我尝试GL_RGBA或GL_BRGA而不是GL_RED时,我得到(0,0,0,1; ......)。

我做错了吗?

1 个答案:

答案 0 :(得分:2)

glGetTexImage,顾名思义,从纹理获取像素数据。具体来说,当前绑定到您传递的目标的纹理,在本例中为GL_TEXTURE_2D。因为你绑定到GL_TEXTURE_2D的最后一件事是,它会从默认纹理中读取。

如果您想read pixels from the framebuffer,则必须使用glReadPixels。虽然您必须将其绑定到GL_READ_FRAMEBUFFER,但您必须将glReadBuffer设置为指向要读取的颜色缓冲区。

但即使你做了所有这些,你也从未真正渲染任何东西到帧缓冲区。