opengl - 如何通过opengl混合RGB和BGRA原始图像?

标签 opengl freeglut blending

我对 OpenGL 很陌生

尝试混合 RGB 和 BGRA 原始图像。

  • RGB 是背景图像
  • RGBA 为前景图像

以下源仅获取输出,“osd_raw”图像。未发生混合。

在下面的代码中加载 2 个原始图像。 创建 2 个纹理并与其绑定(bind)。 使用 glBlendFunc 进行混合。 输出未混合。

请告诉我哪里出了问题。

void display()
{

    GLuint texture[2];
    int width = 960;
    int height = 540;
    unsigned char *osd_raw = loadFile("./osd.raw");
    unsigned char *video_raw = loadFile("./video.raw");

    glClearColor(0.1, 0.1, 0.1, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(2, texture);

    glEnable( GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, video_raw);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, osd_raw);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex3f(-1, -1, 0);
    glTexCoord2f(0, 1);
    glVertex3f(-1, 1, 0);
    glTexCoord2f(1, 1);
    glVertex3f(1, 1, 0);
    glTexCoord2f(1, 0);
    glVertex3f(1, -1, 0);
    glEnd();

    glFlush();
}

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

    glutInitWindowSize(960, 540);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("glut test");

    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

最佳答案

首先,请注意,使用 glBegin/glEnd 序列进行绘图已被弃用十多年了。 了解 Fixed Function Pipeline并参见Vertex Specification最先进的渲染方式。


如果要混合 2 个纹理,则必须绑定(bind)第一个纹理并使用正确的纹理坐标属性集来绘制四边形。 之后,您必须绑定(bind)第二个纹理并再次绘制四边形,并启用混合(请参阅 Blending ):

glDisable( GL_BLEND);

glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, 0);
glTexCoord2f(0, 1);
glVertex3f(-1, 1, 0);
glTexCoord2f(1, 1);
glVertex3f(1, 1, 0);
glTexCoord2f(1, 0);
glVertex3f(1, -1, 0);
glEnd();

glEnable( GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, 0);
glTexCoord2f(0, 1);
glVertex3f(-1, 1, 0);
glTexCoord2f(1, 1);
glVertex3f(1, 1, 0);
glTexCoord2f(1, 0);
glVertex3f(1, -1, 0);
glEnd();

进一步注意,Depth Test必须禁用或设置为例如GL_LEQUAL,当绘制第二个四边形时。否则第二个四边形将被深度测试丢弃。

由于混合函数是 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,当然第二个纹理的某些 Alpha channel 必须小于 1.0。

关于opengl - 如何通过opengl混合RGB和BGRA原始图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580386/

相关文章:

python - Blender 2.6 JSON 导出器,纹理仅在立方体的一侧错误

c++ - 使用 freeglut/glew 在 VS2010 中设置 OpenGL 项目

c++ - 如何检测与 C++、OpenGL 和 freeglut 的冲突?

algorithm - 是否有一种颜色混合算法可以像混合真实颜色一样工作?

javascript - 删除 JavaScript 热图中的颜色混合?

c - Opengl-如何使用事件键盘围绕轴自身旋转四面体?

c++ - 多次调用 cv::ogl::Texture2D.copyFrom() 导致 cv::Exception (-219)

c++ - 我错过了什么纹理无法正常工作 OpenGL

OpenGL 异常混合结果

c++ - 计算正方形的法线