开发者

OpenGL Framebuffer, drawing to texture

We have a hard time figuring out rendering to texture using framebuffer objects. We have managed to draw our texture unto another texture, but the texture isn't centered.

If we set the the texture size to correspond to the window size, it's centered, but we want to be able to manage smaller textures.

GLuint texture[3];
unsigned int fbo;
SDL_Surface *TextureImage[1];

int LoadGLTextures( )
{

  /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */
  if ( ( TextureImage[0] = SDL_LoadBMP( "crate.bmp" ) ) )
   {

    /* Create The Texture */
    glGenTextures( 1, &texture[0] );

    /* Typical Texture Generation Using Data From The Bitmap */
    glBindTexture( GL_TEXTURE_2D, texture[0] );

    /* 开发者_StackOverflow中文版Generate The Texture */
    glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[0]->w,
                 TextureImage[0]->h, 0, GL_BGR,
                 GL_UNSIGNED_BYTE, TextureImage[0]->pixels );

    /* Linear Filtering */
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
   }

  /* Free up any memory we may have used */
  if ( TextureImage[0] )
      //SDL_FreeSurface( TextureImage[0] );

  return 1;
}


void initFrameBufferTexture(void) {
  glGenTextures(1, &texture[1]); // Generate one texture
  glBindTexture(GL_TEXTURE_2D, texture[1]); // Bind the texture fbo_texture


  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TextureImage[0]->w, TextureImage[0]->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // Create a standard texture with the width and height of our window


    // Setup the basic texture parameters

  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    //glGenerateMipmapEXT(GL_TEXTURE_2D);

    // Unbind the texture
  glBindTexture(GL_TEXTURE_2D, 0);
}

void initFrameBuffer(void) {

  initFrameBufferTexture(); // Initialize our frame buffer texture

  glGenFramebuffersEXT(1, &fbo); // Generate one frame buffer and store the ID in fbo
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer

  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture[1], 0); // Attach the texture fbo_texture to the color buffer in our frame buffer



  GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); // Check that status of our generated frame buffer

  if (status != GL_FRAMEBUFFER_COMPLETE_EXT) // If the frame buffer does not report back as complete
   {
    exit(0); // Exit the application
   }

    //glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Unbind our frame buffer
}


int main(int argc, char *argv[])
{
    gfx_manager.init(640, 480, 32);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.375f, 0.375f, 0);
    glClearColor(0.3, 0.3, 0.3, 0);
    glClear(GL_COLOR_BUFFER_BIT);

  LoadGLTextures();

  initFrameBuffer();

  glMatrixMode(GL_TEXTURE);

  glGenFramebuffersEXT(1, &fbo);
  glBindTexture(GL_TEXTURE_2D, texture[0]); 
  glPushAttrib(GL_VIEWPORT_BIT);


    //glGenerateMipmapEXT();

    //glOrtho(0, TextureImage[0]->w, TextureImage[0]->h, 0, 0, 1);
    //glViewport(0, 0, TextureImage[0]->w, TextureImage[0]->h);

  glClearColor (0.0f, 0.0f, 1.0f, 0.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


  glLoadIdentity();


  glBegin( GL_QUADS );                /* Draw A Quad */

  glTexCoord2f(0.0f, 0.0f);glVertex2f(0.0f, 0.0f);
  glTexCoord2f(1.0f, 0.0f);glVertex2f(0.0f + TextureImage[0]->w , 0.0f);
  glTexCoord2f(1.0f, 1.0f);glVertex2f(0.0f + TextureImage[0]->w, 0.0f + TextureImage[0]->h);
  glTexCoord2f(0.0f, 1.0f);glVertex2f(0.0f, 0.0f + TextureImage[0]->h);
  glEnd( );

  glPopAttrib();
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

  glLoadIdentity();

  glClearColor (0.0f, 0.0f, 1.0f, 1.0f);


  glBindTexture(GL_TEXTURE_2D, texture[1]); 


  glLoadIdentity();

  glBegin( GL_QUADS );                /* Draw A Quad */

  glTexCoord2f(0.0f, 0.0f);glVertex2f(300.0f, 200.0f);
  glTexCoord2f(0.0f, 1.0f);glVertex2f(300.0f , 200.0f + TextureImage[0]->h);
  glTexCoord2f(1.0f, 1.0f);glVertex2f(300.0f + TextureImage[0]->w, 200.0f + TextureImage[0]->h);
  glTexCoord2f(1.0f, 0.0f);glVertex2f(300.0f + TextureImage[0]->w, 200.0f);
  glEnd( );



    SDL_GL_SwapBuffers( );
    sleep(100); 

    return 0;
}


You probably have your matrices and viewport set to match your window size. Make sure you change them to be appropriate values for your framebuffer size before drawing to it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜