OpenGL Framebuffer, рисование в текстуру

Нам трудно разобраться с рендерингом в текстуру с использованием объектов фреймбуфера. Нам удалось нарисовать нашу текстуру на другой текстуре, но текстура не центрирована.

Если мы установим размер текстуры в соответствии с размером окна, он будет центрирован, но мы хотим иметь возможность управлять меньшими текстурами.

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

    /* 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;
}

person user634545    schedule 24.09.2011    source источник
comment
Что вы подразумеваете под текстурой не по центру? Где не по центру?   -  person Nicol Bolas    schedule 25.09.2011
comment
Мне любопытно, как здесь употреблено слово «мы»… этот парень коллективный разум?   -  person    schedule 25.09.2011
comment
@nil: Немногие проекты выполняются одним программистом.   -  person Ben Voigt    schedule 25.09.2011
comment
@Ben Правда, но если он / она не рассматривает учетную запись как группу, странно использовать we в вопросе таким, какой он есть (главным образом потому, что я придерживаюсь предположения, что одна учетная запись - это один человек).   -  person    schedule 25.09.2011
comment
Это действительно звучит так, будто зерги решили написать игру. Cerebrates проводят код-ревью.   -  person andyvn22    schedule 25.09.2011


Ответы (1)


Вероятно, у вас есть матрицы и окно просмотра, соответствующие размеру вашего окна. Перед рисованием убедитесь, что вы изменили их, чтобы они соответствовали размеру вашего фреймбуфера.

person andyvn22    schedule 25.09.2011