前面两节分别说到了深度测试和正背面剔除,这两种技能都是OpenGL中经常使用的提升渲染性能的方式;裁剪也是一种提升渲染性的方式. OpenGL容许只刷新屏幕上发⽣变化的部分,能够在要进行渲染的窗⼝去指定⼀个裁剪框.在这个裁剪框里去渲染你须要的画面。bash
其基本原理是在渲染时限制绘制区域,经过此技术能够再屏幕(帧缓冲)指定⼀个矩形区域。而后启⽤剪裁测试,不在此矩形区域内的片元讲被丢弃,只有在此矩形区域内的片元才有可能进⼊帧缓冲。所以实际达到的效果就是在屏幕上开辟了⼀个⼩窗口,能够再其中进⾏指定内容的绘制。
函数
裁剪测试发生在片元着色器,此时已经光栅化将3D图形转换成了2D图形。裁剪测试肯定(Xw,Yw)是否位于当前OpenGL上下文所肯定的那一部分裁剪矩形范围内.若是该⽚段位于裁剪区域以外,则被抛弃。 post
这里须要了解和区别一下窗口、视口和裁剪区域这三个几率。性能
OpenGL中,混合(Blending)一般是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体自己的颜色和它背后其它物体的颜色的不一样强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它本身的颜色,但它最终的颜色还包含了玻璃以后全部物体的颜色。这也是混合这一名字的出处,咱们混合(Blend)(不一样物体的)多种颜色为一种颜色。因此透明度能让咱们看穿物体。
测试
要想渲染有多个透明度级别的图像,咱们须要启用混合(Blending) ;glEnable(GL_BLEND)。启用了混合以后,咱们须要告诉OpenGL它该如何混合它。当混合功能被启动时,源颜色和目标颜色的组合方式是经过混合方程式控制的:Cf = (Cs * S) + (Cd * D)。其中Cf表示最终计算获得的颜⾊ ;Cs表示源颜色;Cd表示目标颜色;S表示源混合因子指定了alpha值对源颜色的影响;D表示目标混合因子指定了alpha值对目标颜色的影响。spa
片元着色器运行完成后,而且全部的测试都经过以后,这个混合方程(Blend Equation)才会应用到片元颜色输出与当前颜色缓冲中的值(当前片断以前储存的以前片断的颜色)上。源颜色和目标颜色将会由OpenGL自动设定,但源因子和目标因子的值能够由咱们来决定。先来看一个简单的例子:
code
假设有两个方形,如今但愿将这个半透明的绿色方形绘制在红色方形之上。红色的方形将会是目标颜色(因此它应该先在颜色缓冲中),咱们将要在这个红色方形之上绘制这个绿色方形。那么问题来了。因子值设置怎么设置?若是至少想让绿色方形乘以它的alpha值,那么将要将源混合因子S设置为源颜色向量的alpha值,也就是0.6。接下来就应该清楚了,目标方形的贡献应该为剩下的alpha值。若是绿色方形对最终颜色贡献了60%,那么红色方块应该对最终颜色贡献了40%,即1.0-0.6. 带入方程式可得:Cf = [0 1 0 0.6] * 0.6 + [1 0 0 1] * 0.4。结果就是重叠方形的片断包含了一个60%绿色,40%红色的一种脏兮兮的颜色.cdn
最终的颜色将会被储存到颜色缓冲中,替代以前的颜色。那么在OpenGL中该若是设置混合因子呢。
blog
设置混合因⼦子,须要⽤用到glBlendFun函数。ci
glBlendFunc(GLenum sfactor, GLenum dfactor)
两个参数分别表示源因子与目标因子。OpenGL为咱们定义了不少个选项,下面列出大部分最经常使用的选项:
表中R、G、B、A 分别表明 红、绿、蓝、alpha;下标S、D,分别表明源、目标;C 表明常量颜色(默认⿊色) 。注意其中C常量颜色能够经过glBlendColor函数来另外设置。
好比上面的例子咱们使用源颜色向量的alpha做为源因子,使用1-alpha做为目标因子。对应一下的glBlendFun。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);复制代码
也可使用glBlendFuncSeparate为RGB和alpha通道分别设置不一样的选项。好比:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);复制代码
这个函数和咱们以前设置的那样设置了RGB份量,但这样只能让最终的alpha份量被源颜色向量的alpha值所影响到。
OpenGL甚至给了咱们更多的灵活性,容许咱们改变方程中源和目标部分的运算符。当前源和目标是相加的,但若是愿意的话,咱们也可让它们相减。glBlendEquation(GLenum mode)容许咱们设置运算符,它提供了三个选项:
一般咱们均可以省略调用glBlendEquation,由于 GL_FUNC_ADD对大部分的操做来讲都是咱们但愿的混合方程,但若是你真的想打破主流,其它的方程也可能符合你的要求。