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

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 );
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、裁剪 另一种提高渲染性能的方法是只刷新屏幕上发生变化的部分。我们可能还需要将 OpengGL 渲染限制在窗口中...
    凡几多阅读 2,186评论 3 6
  • [TOC] 学习目标 渲染过程中可能产生的问题 油画渲染 正面和背面剔除 深度测试 多边形模型 多边形偏移 裁剪 ...
    velue阅读 1,786评论 0 0
  • 一、正背面踢除(Face Culling) 在渲染3D场景过程中可能会产生以下问题 我们需要决定哪些部分是对观察者...
    MirL阅读 656评论 0 0
  • 我们把OpenGL渲染时会把颜⾊色值存在颜⾊缓存区中,每个片段的深度值也是放在深度缓冲区。当深度 缓冲区被关闭时,...
    hie阅读 548评论 0 0
  • 中午回来第一件事翻手机,问我看成绩了么?(这两次都往下滑不能在打击他了,看到之前几个成功的家长的日记都说到鼓励、赞...
    翟小硕阅读 120评论 0 0