2016-11-22 4 views
2

У меня есть два буфера с загруженными изображениями .rgb. Исходное изображение сохраняется в frame_buffer, а второе хранится в temp_buffer. Я хочу переключиться между этими двумя изображениями в окне GLUT, когда пользователь нажимает кнопку, как я могу расширить свой код, чтобы сделать это?Как переключаться между текстурами/фреймворками при нажатии клавиши с помощью GLUT?

typedef struct pixel{ 
    GLbyte r; 
    GLbyte g; 
    GLbyte b; 
}Pixel; 

Pixel frame_buffer[WIDTH][HEIGHT]; //original image 
Pixel temp_buffer[WIDTH][HEIGHT]; //embossed image 

GLuint texture; 

int window_id; 


void keyboardFunction(unsigned char button, int x, int y){ 
    switch(button){ 
     case 'S': 
     case 's': 
      // WHEN USER PRESS 'S', NEW IMAGE FROM temp_buffer IS 
      // LOADED, HOW CAN I DO THIS? 
      break; 
     default: 
      break; 
    } 
    glutPostRedisplay(); 
} 


// Initialize OpenGL state 
void init() { 
    // Texture setup 
    glEnable(GL_TEXTURE_2D); 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

    // Other 
    glClearColor(0, 0, 0, 0); 
    gluOrtho2D(-1, 1, -1, 1); 
    glLoadIdentity(); 
    glColor3f(1, 1, 1); 

    loadInputFromUser(); 
    emboss(); 
} 


void display() { 
    // Copy frame_buffer to texture memory 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, frame_buffer); 
    // Clear screen buffer 
    glClear(GL_COLOR_BUFFER_BIT); 
    // Render a quad 
    glBegin(GL_QUADS); 
     glTexCoord2f(1, 0); glVertex2f(1, 1); 
     glTexCoord2f(1, 1); glVertex2f(1, -1); 
     glTexCoord2f(0, 1); glVertex2f(-1, -1); 
     glTexCoord2f(0, 0); glVertex2f(-1, 1); 
    glEnd(); 
    // Display result 
    glFlush(); 
    //glutPostRedisplay(); 
    glutSwapBuffers(); 
} 


// Main entry function 
int main(int argc, char **argv) { 

    // Init GLUT 
    glutInit(&argc, argv); 
    glutInitWindowPosition(-1, -1); 
    glutInitWindowSize(WIDTH, HEIGHT); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutCreateWindow("Convolution Filter"); 
    // Set up OpenGL state 
    init(); 
    // Run the control loop 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboardFunction); 
    glutReshapeFunc(changeViewPoint); 

    GLenum err = glewInit(); 
    if (GLEW_OK != err){ 
     fprintf(stderr, "GLEW error"); 
     return 1; 
    } 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 
  1. исходное изображение сохраняется в frame_buffer

    enter image description here

  2. изображения фильтрованного барельефа, хранящемся в temp_buffer (да, я знаю его не идеальный: D)

    enter image description here

Я хочу переключаться между ними с помощью клавишной панели.

ответ

2

Редактировать следующие фрагменты:

Pixel frame_buffer[WIDTH][HEIGHT]; //original image 
Pixel temp_buffer[WIDTH][HEIGHT]; //embossed image 
int which_image = 0; 

...

case 'S': 
    case 's': 
     which_image ^= 1; 
     break; 

...

glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, which_image == 0 ? frame_buffer : temp_buffer); 

...

glFlush(); 
glutPostRedisplay(); 
glutSwapBuffers(); 

Это, как говорится, вы в настоящее время загружаете текстуру (glTexImage2D) для каждого обрамленного кадра. Вы должны загружать его только один раз во время запуска и каждый раз, когда он изменяется.