OpenGL抠像之后用CPU与背景混合的操作

1.首先要明白OpenGL自身的混合操作

//打开OpenGL混合,并设置为预乘模式混合
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
while (!glfwWindowShouldClose(window))
{
    // input
    // -----
    processInput(window);

    // render
    // ------
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
//绘制背景
    ourShader1.use();
    glBindVertexArray(VAO);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture2);
    ourShader1.setInt("texture1", 0);
    glDrawArrays(GL_TRIANGLES, 0, 6);
//绘制前景
    ourShader.use();
    ourShader.setFloat("iResolutionx", SCR_WIDTH);
    ourShader.setFloat("iResolutiony", SCR_HEIGHT);
    glBindVertexArray(VAO1);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(glGetUniformLocation(ourShader.ID, "texture1"), 1);
    glDrawArrays(GL_TRIANGLES, 0, 6);

    // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
    // -------------------------------------------------------------------------------
    glfwSwapBuffers(window);
    glfwPollEvents();
}

如上,通过两次绘制,在shader里面把像素转成预乘像素。即FragColor=vec4(texturecolor.rgb*texturecolor.a, texturecolor.a); 这样输出的像素在OpenGL内部会自动根据绘制的顺序进行src与dst的混合—https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/03%20Blending/

2.与CPU结合的混合

1.如上,因为开启OpenGL的blend后,会在OpenGL内部进行混合,因此如果要用CPU混合的话,就不能开启OpenGL的blend模式。
2.shader输出预乘像素
3.将像素读取到CPU,进行混合。要注意的此时的像素已经是预乘了的,混合的公式可以参考这个链接—https://apoorvaj.io/alpha-compositing-opengl-blending-and-premultiplied-alpha/

你可能感兴趣的:(OpenGL)