混合、面剔除

混合

在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。

一个物体的透明度,被定义为它的颜色的alpha值。

开启混合:glEnable(GL_BLEND);

OpenGL以下面的方程进行混合:

混合、面剔除_第1张图片
混合方式

片段着色器运行完成并且所有的测试都通过以后,混合方程才能自由执行片段的颜色输出,当前它在颜色缓冲中(前面片段的颜色在当前片段之前储存)。源和目标颜色会自动被OpenGL设置,而源和目标因子可以让我们自由设置。

混合函数

void glBlendFunc(GLenum sfactor, GLenum dfactor)

设置源(source)和目标(destination)因子。

混合、面剔除_第2张图片
常用可选参数

颜色常数向量Cconstant可以用glBlendColor函数分开来设置。

也可以为RGB和alpha通道各自设置不同的选项,使用glBlendFuncSeperate:

glBlendFuncSeperate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,GL_ONE, GL_ZERO);

void glBlendEquation(GLenum mode)允许我们设置不同的操作,有3种可行的选项:

改变混合公式

要让混合在多物体上有效,我们必须先绘制最远的物体,最后绘制最近的物体。普通的无混合物体仍然可以使用深度缓冲正常绘制,所以不必给它们排序。我们一定要保证它们在透明物体前绘制好。当无透明度物体和透明物体一起绘制的时候,通常要遵循以下原则:

先绘制所有不透明物体。 为所有透明物体排序。 按顺序绘制透明物体。

面剔除

可以不用绘制不会出现在观察者视野外的物体(比如角度立方体看不到的面)来提高渲染的性能。

面剔除(Face culling),OpenGL允许检查所有正面朝向(Front facing)观察者的面,并渲染它们,而丢弃所有背面朝向(Back facing)的面,这样就节约了我们很多片段着色器的命令。OpenGL分析顶点数据的连接顺序(Winding order)来判断物体的正面和反面。

顶点链接顺序

混合、面剔除_第3张图片
三角形的顶点链接顺序

默认情况下,逆时针的顶点连接顺序被定义为三角形的正面。实际的顶点连接顺序是在光栅化阶段(Rasterization stage)计算的,所以当顶点着色器已经运行后。顶点就能够在观察者的观察点被看到。

1,启用面剔除:glEnable(GL_CULL_FACE);

2,剔除特定的面:glCullFace(GL_BACK);

GL_BACK,GL_FRONT,GL_FRONT_AND_BACK

3,改变判定正面的标准:glFrontFace(GL_CCW);

默认值是GL_CCW,它代表逆时针,GL_CW代表顺时针顺序。

你可能感兴趣的:(混合、面剔除)