如何在OpenGL场景上绘制透明橡皮带

时间:2011-04-08 12:51:39

标签: c++ qt opengl rubber-band

我正在使用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, &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 个答案:

答案 0 :(得分:2)

只需画一个半透明的(alpha< 1.0)rectangle

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);