Отображение 2D фигур поверх текстуры в OpenGL - PullRequest
2 голосов
/ 12 ноября 2011

Я собираю данные с веб-камеры с помощью OpenCV и отображаю их как текстуру для окна GL, Это отлично работает.

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image->width, image->height, GL_RGB, GL_UNSIGNED_BYTE, image->imageData);

Но я также хочу наложить некоторые базовые фигуры, Md2 модели поверх этого, сохраняя текстуру на заднем плане и в том же самом окне.

Это моя функция, которая передается в glutDisplayFunc()

void drawScene() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Set Projection Matrix
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 0);

    // Setup the view  // Switch to Model View Matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBegin(GL_QUADS); 
    // Trapezoid
    glVertex3f(-0.7f, -1.5f, -5.0f);
    glVertex3f(0.7f, -1.5f, -5.0f);
    glVertex3f(0.4f, -0.5f, -5.0f);
    glVertex3f(-0.4f, -0.5f, -5.0f);
    glEnd(); //End quadrilateral coordinates

    // start drawing the Background texture
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT);
    glEnd();

    glFlush();
    glutSwapBuffers();
}

EDIT новый заказ

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT);
    glEnd();

    glBegin(GL_QUADS); //Begin quadrilateral coordinates
    // Trapezoid
    glVertex3f(-0.7f, -1.5f, -5.0f);
    glVertex3f(0.7f, -1.5f, -5.0f);
    glVertex3f(0.4f, -0.5f, -5.0f);
    glVertex3f(-0.4f, -0.5f, -5.0f);
    glEnd(); //End quadrilateral coordinates

EDIT: Новый порядок и координаты:

glDisable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
// Trapezoid to be displayed on top of texture
glVertex3f(0.2f, 0.3f, -0.6f);
glVertex3f(0.5f, -0.5f, -0.5f);
glVertex3f(0.4f, -0.5f, -0.5f);
glVertex3f(-0.4f, -0.5f, -0.5f);
glEnd(); //End quadrilateral coordinates
////
glEnable(GL_TEXTURE_2D); // start drawing the background texture 
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT);
glEnd();

Результат после выполнения выше и отключения gluOrtho2D()

enter image description here

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

Проверьте документы для gluOrtho2D():

gluOrtho2D устанавливает двумерную область орфографического просмотра.Это эквивалентно вызову glOrtho с ближним = -1 и дальним = 1.

Вы размещаете свою трапецию на Z = -5, далеко позади вашей ближней плоскости отсечения:

glBegin(GL_QUADS);
glVertex3f(-0.7f, -1.5f, -5.0f);
glVertex3f(0.7f, -1.5f, -5.0f);
glVertex3f(0.4f, -0.5f, -5.0f);
glVertex3f(-0.4f, -0.5f, -5.0f);
glEnd(); 

Попробуйте -0,5 для ваших координат Z или хотя бы что-то между -1 и 0.

РЕДАКТИРОВАТЬ: Пример:

#include <GL/glut.h>

int win_w = 0;
int win_h = 0;
GLuint texObj = 0;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // set up projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double halfWidth = (win_w / 2.0);;
    double halfHeight = (win_h / 2.0);
    glOrtho( -halfWidth, halfWidth, -halfHeight, halfHeight, -10, 10 );

    // set up modelview
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // render textured quad
    glEnable(GL_TEXTURE_2D);
    glColor3ub(255,255,255);
    glPushMatrix();
        glScalef(halfWidth * 0.9, halfHeight * 0.9, 1.0);
        glBegin(GL_QUADS);
            glTexCoord2f(0,0);
            glVertex2f(-1,-1);
            glTexCoord2f(1,0);
            glVertex2f(1,-1);
            glTexCoord2f(1,1);
            glVertex2f(1,1);
            glTexCoord2f(0,1);
            glVertex2f(-1,1);
        glEnd();
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);

    // draw quad on top
    glColor3ub(255,0,0);
    glPushMatrix();
        // move quad back a bit so it's above Z=0
        glTranslatef(0,0,-1);
        glScalef(50,50,50);
        glBegin(GL_QUADS);
            glVertex2f(-1,-1);
            glVertex2f(1,-1);
            glVertex2f(1,1);
            glVertex2f(-1,1);
        glEnd();
    glPopMatrix();

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    win_w = w;
    win_h = h;
    glViewport(0, 0, w, h);
}

GLuint getTexture()
{
    // 2x2 texture
    unsigned char bytes[] =
    {
          0,   0, 255,      255, 255, 255,
        255,   0,   0,      0, 255,   0,
    };

    GLuint texID;
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, bytes);
    return texID;
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("Texture");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    texObj = getTexture();
    glutMainLoop();
    return 0;
}
1 голос
/ 12 ноября 2011

Обязательно отключите текстурирование (glDisable(GL_TEXTURE_2D)), если вы рисуете вещи, которые не должны быть текстурированы, как ваша трапеция.

В противном случае последняя заданная координата текстуры будет применяться ко всем вашим новым вершинам, выборкаваша текстура в каком-то странном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...