lock&_lock Ответов: 1

Как правильно имплементировать событие клавиши клавиатуры для изменения ввода изображения в opengl с помощью SOIL ?


Мне нужно выполнить манипуляцию пикселями с изображениями в glut OpenGL (я знаю, что он старый, но я связан многими другими причинами). Мне нужно изменить изображение несколько раз, показывая их одновременно. Я пытаюсь использовать ключевое событие для этого. Кроме того, я использую библиотеку почвы для загрузки своего изображения.

Что я уже пробовал:

Вот почему я занимаюсь внедрением :

static void         init(void);
static void         mainLoop(void);
static void         keyEvent( unsigned char key, int x, int y);

int main(int argc, char *argv[])
{
    init();
    image = SOIL_load_image("Images/img1.jpg", &width, &height, 0, SOIL_LOAD_RGBA);
    if(image == NULL) exit(0);
    
    argViewportSetImageSize(vp, width, height);
    argViewportSetPixFormat(vp, AR_PIXEL_FORMAT_RGBA);
    argViewportSetDispMode(vp, AR_GL_DISP_MODE_FIT_TO_VIEWPORT_KEEP_ACPECT_RATIO);

    argSetKeyFunc(keyEvent);
    glutIdleFunc(mainLoop);
    glutMainLoop(); 
}


ключевое событие :
static void keyEvent( unsigned char key, int x, int y)
{
    if( key == 'a' )
      {image = SOIL_load_image("Images/img2.jpg", &width, &height, 0, SOIL_LOAD_RGBA);
       if(image == NULL) exit(0);
       printf("%d x %d\n", width, height);
       genImages();
       }  
    //other key events
}



Я замечаю, как ключевое событие работает для любой другой команды (например, манипулировать значением пикселя), но не работает для изменения ввода изображения. Есть ли какой - нибудь способ добиться этого ?

Stefan_Lang

Не могу помочь вам в специфике glut, но вы загружаете изображение перед настройкой функции ключевого события и перед входом в основной цикл glut - как вы ожидаете, что keyEvent может быть вызван в этом случае?

P.S.: может быть, я не правильно понял ваше намерение: если вы намеревались изменить изображение с исходного на другое, после того как первое изображение будет загружено, то вопрос заключается в другом: как вы получаете glut для отображения этого изображения после завершения инициализации? Очевидно, что часть инициализации отвечает за ассоциацию данных изображения с дисплеем - идентифицируйте эту часть и повторите ее в своей функции keyEvent.

1 Ответов

Рейтинг:
0

Rick York

Единственное, что делает ваш обработчик событий, - это загружает изображение. Что обрабатывает отображение изображения? Обычно, когда вы загружаете изображение, вы должны сделать недействительным окно отображения, чтобы оно было перерисовано. Я не вижу кода, который делает это, так что, вероятно, именно этого вам не хватает, чтобы заставить его работать.


lock&_lock

Привет, спасибо ! Я обновил свой код. Теперь он показывает разрывное изображение, черно-белое шумовое изображение, как по телевизору. Я снова проверю свой код и обновлю его снова.