0

After learning that I have to use a FBO to read floating point data from shader, I have tried this but with no luck:

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];
}

My shader code:

out float data;

void main()
{  
  data = 0.02;
}

This prints all 0s. And when I try GL_RGBA or GL_BRGA instead of GL_RED, I get (0, 0, 0, 1; ...).

Am I doing something wrong?

4

1 に答える 1

3

glGetTexImageは、名前が示すように、textureからピクセル データを取得します。具体的には、渡すターゲット (この場合は ) に現在バインドされているテクスチャですGL_TEXTURE_2D。最後にバインドしたものGL_TEXTURE_2Dzeroだったので、デフォルトのテクスチャから読み込みます。

フレームバッファからピクセルを読み取りたい場合は、glReadPixels. にバインドする必要がありますが、読み取り元のカラー バッファーを指すようにGL_READ_FRAMEBUFFER設定する必要があります。glReadBuffer

しかし、それをすべて行ったとしても、実際にはフレーム バッファに何もレンダリングしていません。

于 2013-06-01T22:32:02.100 に答える