美文网首页
OpenGL 混合

OpenGL 混合

作者: 番茄炒西红柿啊 | 来源:发表于2020-07-20 16:07 被阅读0次

开启深度测试后,如果重叠的图层中,上层的图层是半透明的情况下我们不能采用直接覆盖的方式,而需要用到混合,在图层重叠的部分绘制的是混合后的内容。

首先我们绘制两个矩形,上层橙色矩形为半透明,下层绿色矩形为不透明,在不打开颜色混合时效果如下:

void renderScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    
    glEnable(GL_DEPTH_TEST);
    
    GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
    GLfloat vOrange[] = {255 / 255.0, 127 / 255.0, 80/ 255.0, 0.75f};
    
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);
    greenBatch.Draw();
    
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vOrange);
    orangeBatch.Draw();
    
    glutSwapBuffers();
    glDisable(GL_DEPTH_TEST);
}

可以发现在为打开混合的情况下,重叠部分并没有出现我们预期的现象。接下来我们打开颜色混合代码。

void renderScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    
    glEnable(GL_DEPTH_TEST);
    // 打开颜色混合
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    
    GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
    GLfloat vOrange[] = {255 / 255.0, 127 / 255.0, 80/ 255.0, 0.75f};
    
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);
    greenBatch.Draw();
    
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vOrange);
    orangeBatch.Draw();
    
    glutSwapBuffers();
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);
}

打开&关闭 (单纯的将两个图层重叠时)

//开启,
glEnable(GL_BlEND);
//关闭
glDisable(GL_BlEND);

开关方式 + 混合方程式 ()

//开启,
glEnable(GL_BlEND);
//设置混合因子--默认值是 GL_SRC_ALPHA 和 GL_ONE_MINUS_SRC_ALPHA
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//关闭
glDisable(GL_BlEND);
  • glBlendFunc中的参数不同,则混合计算公式就不同
  • 默认为传参为GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA, 其对应的计算公式为:
//Cf -- 最终组合的颜色值
//Cd:源颜色 -- 当前渲染命令传入的颜色值
//CS:目标颜色 -- 颜色缓冲区中已经存在的颜色值
//S:源混合因子
//D:目标混合因子 
Cf = (Cs * S) + (Cd * D)

相关文章

  • Opengl混合算法探究

    在我们的实际应用中使用OpenGL进行混合常见的问题有以下三种: 使用Opengl自带的混合算法 自定义混合算法 ...

  • OpenGL 混合

    开启深度测试后,如果重叠的图层中,上层的图层是半透明的情况下我们不能采用直接覆盖的方式,而需要用到混合,在图层重叠...

  • OpenGL 混合

    原因 颜色缓冲区存储着像素点的颜色信息,当深度缓冲区开启时,当该像素点深度小于原来的深度时的颜色信息就会被替换为新...

  • NDK OpenGL ES 3.0 开发(十二):混合

    该原创文章首发于微信公众号:字节流动 OpenGL ES 混合 OpenGL ES 混合本质上是将 2 个片元的颜...

  • OpenGL中图层混合公式的一点探讨

    OpenGL中图层混合公式的一点探讨 一、问题的提出 OpenGL混合的时候,常常会用到如下一个公式: 其中Cf表...

  • opengl学习-混合

    不使用混合如何实现透明度 通过在片源着色器中添加if (texColor.a < 0.1) discard;来根据...

  • OpenGL-颜色混合浅析

    基础理论 在OpenGL中,物体透明技术通常被叫做混合(Blending)。 OpenGL渲染时会把颜色值存在颜色...

  • 高级OpenGL-03.混合(Blending)

    混合 在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明的物体(或物体的一部分)非纯色而是混合...

  • 混合、面剔除

    混合 在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体(或物体的一部分)非纯色而是混合...

  • OpenGL --混合、多重采样

    颜色混合 在OpenGL中使用glEnable(GL_BlEND)来开启颜色混合。目标颜色:已经存储在颜色缓存区的...

网友评论

      本文标题:OpenGL 混合

      本文链接:https://www.haomeiwen.com/subject/udqmhktx.html