一 、剪裁测试
它主要在渲染场景时限制绘制区域,用它可以方便地实现同时在屏幕上绘制主视角与次视角场景的功能 。
工作原理 :先绘制主视角场景,再启用剪裁测试设置剪裁窗口,然后绘制次视角场景。
二、模板测试
剪裁测试可以将绘制限定在一个距形区域,模板测试可以将绘制限定在一个任意形状的区域内,也称为蒙板测试。
模板测试需要绘制两次,第一次产生存储特殊区域信息模板值的模板缓冲,第二次利用模板缓冲中的值 进行测试,使绘制仅限于在特定区域内。
三、任意剪裁平面
视景体除了六个剪裁平面(左,右,底,顶,远)之外,还可以再指定其它任意平面以进行剪裁,剪裁平面 可以删除 场景中无关的物体 ,例如显示物体 的剖面视图,WebGL使用 剪裁平面时只需给出参数即可。具体步骤如下:
(1)给出定义剪裁平面的4个参数A、B、\C、D这个4 个参数分别是平面解析方程Ax+By+Cz+D=0的4个系数。
(2)传递4个参数至渲染管线,以备着色器使用。
(3) 在顶点着色器中判断顶点是否在平面的一侧,具体方法为: 将顶点坐标代入平面方程计算后,将值传入片元着色器。
(4)在片元着色器中根据接收到平面方程的值0与之间的关系得出顶点与剪裁平面之间的位置关系,决定是否丢弃片元。
着色器中相关代码 :
顶点着色器:
#version 300 es
.....
uniform vec4 u_clipPlane; //剪裁平面
out float u_clipDist; //传递给片元着色器的剪裁信息
.....
void main(){
//将顶点位置代入平面方程,>0则顶点在平面的上侧,反之在平面的下侧。
u_clipDist=dot(aPostion.xyz,u_clipPlane.xyz)+u_clipPlane.w;
}
片元着色器
#version 300 es
.....
in float u_clipDist; //接收从顶点着色器传来的参数
void main(){
......
if(u_clipDist<0.0) discard; //根据剪裁信息值是否小于0决定是否丢弃片元。
......
}