Как нарисовать прозрачную резиновую ленту на сцене OpenGL

#c #qt #opengl #rubber-band

#c #qt #opengl #резиновая лента

Вопрос:

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

 void GLWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, amp;m_pTextureId);
    glBindTexture(GL_TEXTURE_2D, m_pTextureId);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
void GLWidget::resizeGL(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1,1,-1,1,-1,1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void GLWidget::setTextureData(BYTE *data, int width, int height)
{
    makeCurrent();
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if (m_isTextured)
        glTexSubImage2D(GL_TEXTURE_2D,0,0,0,width,height,GL_BGRA_EXT,GL_UNSIGNED_BYTE,data);
    else
        glTexImage2D(GL_TEXTURE_2D,0,3,width,height,0,GL_BGRA_EXT,GL_UNSIGNED_BYTE,0);
    glBindTexture(GL_TEXTURE_2D,m_pTextureId);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0,0.0);glVertex2f(-1.0,-1.0);
    glTexCoord2f(0.0,1.0);glVertex2f(-1.0,1.0);
    glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
    glTexCoord2f(1.0,0.0);glVertex2f(1.0,-1.0);
    glEnd();
    swapBuffers();
}
  

Я передаю захваченные данные кадра в setTextureData, это работает, но я не знаю, хорошо ли это…


Спасибо за ответ @genpfault,

я использовал x1 = 0, y1 = 0, x2 = 1, y2 = 1, но он рисует прямоугольник во всей области текстуры. и рисует еще 1 прямоугольник с координатами x1,y1… . Как я могу это исправить. Кстати, как я могу удалить этот прямоугольник?, Есть еще одна проблема, если я рисую прямоугольник, а затем текстурирую снова, прямоугольник становится невидимым…

Ответ №1:

Просто нарисуйте полупрозрачный (альфа < 1.0) прямоугольник:

 glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4ub(255, 255, 255, 128);
glRectf(x1, y1, x2, y2);
glDisable(GL_BLEND);