glTexImage2D несколько изображений - PullRequest
4 голосов
/ 31 января 2011

Я рисую изображение из полноэкранного режима openCV, это большое изображение со скоростью 60 кадров в секунду, поэтому мне нужен более быстрый способ, чем графический интерфейс openCV.

Используя OpenGL я делаю:

void paintGL() {
    glClear (GL_COLOR_BUFFER_BIT);
    glClearColor (0.0,0.0,0.0,1.0);

    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,height,0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

Теперь я хочу нарисовать два изображения сбоку: сбоку - используя оборудование openGL для их масштабирования.
Я могу уменьшить изображение, изменив размер четырехугольника. Я не понимаю, как загрузить два изображения с помощью функции glTexImage2 (), поскольку с изображением не связан дескриптор или идентификатор.

Ответы [ 2 ]

11 голосов
/ 31 января 2011

Причина, по которой вы не видите, как добавить другую текстуру, заключается в том, что в опубликованном вами коде отсутствуют две важные функции: glGenTextures и glBindTexture. Первый будет генерировать текстурные объекты в контексте OpenGL (места для текстур, существующих на графическом оборудовании). Второй «выбирает» один из этих объектов текстуры для последующих вызовов (glTex ..), чтобы повлиять на него.

Прежде всего, такие функции, как glTexParameteri и glTexImage2D, не нужно вызывать снова при каждом цикле рендеринга ... но я думаю, что в вашем случае вы должны это делать, потому что изображения постоянно меняются. По умолчанию в вашем коде используемый объект текстуры является нулевым (зарезервированный для значения по умолчанию). Вы должны создать два текстурных объекта и связать их один за другим для достижения желаемого результата:

GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example).

void initGL() {
    glClearColor (0.0,0.0,0.0,1.0);

    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,height,0);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1]

    glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}

void paintGL() {
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture.
    //then load it into the graphics hardware:
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0 );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);  //you should probably change these vertices.
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture.
    //then load it into the graphics hardware:
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1 );
    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2i(0,height);  //you should probably change these vertices.
    glTexCoord2i(0,1); glVertex2i(0,0);
    glTexCoord2i(1,1); glVertex2i(width,0);
    glTexCoord2i(1,0); glVertex2i(width,height);
    glEnd();
}

Это в основном то, как это делается. Но я должен предупредить вас, что мои знания об OpenGL немного устарели, поэтому могут быть более эффективные способы сделать это (я знаю, по крайней мере, что glBegin / glEnd устарела в C ++, заменена на VBO).

2 голосов
/ 01 февраля 2011

Помните, что openGL - это конечный автомат - вы переводите его в состояние, даете ему команду, и она воспроизводит состояния позже.

Одна приятная особенность текстур в том, что вы можете делать что-то вне вызова рисования - поэтому, если на этапе обработки изображения вы генерируете изображение 1, вы можете загрузить его в карту в этот момент.

glBindTexture(GL_TEXTURE_2D,tex_obj[1]);  // select image 1 slot
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1 ); // load it into the graphics card memory

А потом вспомните это в вызове краски

glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select pre loaded image 1
glBegin(GL_QUADS); // draw it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...