美文网首页
OpenGL(九)-渲染技巧(裁剪、混合)

OpenGL(九)-渲染技巧(裁剪、混合)

作者: king_jensen | 来源:发表于2019-05-20 22:25 被阅读0次
    logo.jpg

    裁剪

    在OpenGL中提⾼渲染的⼀种方式.只刷新屏幕上发生变化的部分.OpenGL 允许将要进⾏渲染的窗⼝只去指定⼀个裁剪框.
    基本原理:⽤于渲染时限制绘制区域,通过此技术可以再屏幕(帧缓冲)指定⼀一个矩形区域。启⽤剪裁测试之后,不在此矩形区域内的片元被丢弃,只有在此矩形区域内的片元才有可能进⼊入帧缓冲。因此实际达到的效果就是在屏幕上开辟了了一个小窗⼝,可以再其中进行行指定内容的绘制。
    1.开启裁剪测试

    glEnable(GL_SCISSOR_TEST);
    

    2.关闭裁剪测试

     glDisable(GL_SCISSOR_TEST);
    

    3.指定裁剪窗口

    void glScissor(Glint x,Glint y,GLSize width,GLSize height);
    

    x,y:指定裁剪框左下⻆位置; width , height:指定裁剪尺⼨

    窗口,视⼝,裁剪区域

    •窗⼝: 就是显示界⾯
    • 视⼝: 就是窗口中⽤来显示图形的一块矩形区域,它可以和窗口等大,也可以⽐窗⼝口⼤或者小。只有绘制在视口区域中的图形才能被显示,如果图形有一部分超出了视口区域,那么那⼀部分是看不到的。
    • 通过glViewport()函数设置。

    裁剪区域(平行投影):就是视口矩形区域的最小最大x坐标(left,right)和最小最大y坐标 (bottom,top),而不是窗口的最⼩最大x坐标和y坐标。通过glOrtho()函数设置,这个函数还需指定最近最远z坐标,形成⼀个⽴体的裁剪区域。

    混合

    我们把OpenGL 渲染时会把颜色值存在颜⾊缓存区中,每个⽚段的深度值也是放在深度缓冲区。当深度 缓冲区被关闭时,新的颜⾊将简单的覆盖原来颜⾊缓存区存在的颜色值,当深度缓冲区再次打开时,新 的颜色片段只是当它们⽐原来的值更接近邻近的裁剪平面才会替换原来的颜色片段。

    glEnable(GL_BlEND);
    
    组合颜色

    ⽬标颜色:已经存储在颜色缓存区的颜色值
    源颜色:作为当前渲染命令结果进入颜⾊缓存区的颜⾊值
    当混合功能被启动时,源颜色和⽬标颜⾊的组合⽅式是混合方程式控制的。在默认情况
    下,混合⽅方程式如下所示:

    Cf = (Cs * S) + (Cd * D)
    Cf :最终计算参数的颜⾊
    Cs : 源颜⾊
    Cd :⽬标颜色
    S:源混合因⼦
    D:⽬标混合因⼦

    设置混合因⼦子,需要⽤用到glBlendFun函数

    glBlendFunc(GLenum S,GLenum D); 
    

    S:源混合因⼦
    D:目标混合因⼦

    4FFD0AC821CB3F13263946BD24F720AA.png

    表中R、G、B、A 分别代表 红、绿、蓝、alpha。
    表中下标S、D,分别代表源、目标
    表中C 代表常量颜色(默认黑色)

    案例:

    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    

    如果颜色缓存区已经有一种颜⾊红色(1.0f,0.0f,0.0f,0.0f),这个⽬标颜色Cd,如果在这上面⽤⼀种alpha为0.6的蓝色(0.0f,0.0f,1.0f,0.6f)
    Cd (目标颜色) = (1.0f,0.0f,0.0f,0.0f);
    Cs (源颜色) = (0.0f,0.0f,1.0f,0.6f);
    S = 源alpha值 = 0.6f
    D = 1 - 源alpha值= 1-0.6f = 0.4f
    方程式Cf = (Cs * S) + (Cd * D)
    等价于 = (Blue * 0.6f) + (Red * 0.4f)

    总结

    最终颜色是以原先的红色(⽬标颜色)与后来的蓝⾊(源颜色)进行组合。源颜色的alpha值越⾼,添加的蓝⾊颜色成分越高,⽬标颜色所保留的成分就会越少。 混合函数经常用于实现在其他⼀些不透明的物体前⾯面绘制⼀个透明物体的效果。

    改变组合⽅方程式

    默认混合⽅方程式:
    Cf = (CsS)+(CdD)
    实际上远不⽌这一种混合方程式,我们可以从5个不同的⽅程式中进行选择。

    glbBlendEquation(GLenum mode);
    
    C71D0AC5BB724CB04341AA8400811C0C.png

    除了能使用glBlendFunc来设置混合因子,还可以有更灵活的选择。

    void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
    

    strRGB: 源颜色的混合因⼦
    dstRGB: ⽬标颜⾊的混合因⼦
    strAlpha: 源颜⾊的Alpha因⼦
    dstAlpha:目标颜⾊的Alpha因⼦

    注意:
    glBlendFunc 指定源和⽬标 RGBA值的混合函数;但是glBlendFuncSeparate函数则允许为RGBAlpha 成分单独指定混合函数。
    在混合因⼦子表中,GL_CONSTANT_COLOR,GL_ONE_MINUS_CONSTANT_COLOR,GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT值允许混合方程式中引入一个常量混合颜色.

    常量混合颜⾊
    常量混合颜⾊,默认初始化为⿊色(0.0f,0.0f,0.0f,0.0f),但是还是可以修改这个常量混合颜 ⾊。

    void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha );
    

    相关文章

      网友评论

          本文标题:OpenGL(九)-渲染技巧(裁剪、混合)

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