在Android中,我们所熟知的是在ES管线中,其在图元装配时,会进行图元组装与图元分配,这样就回剪裁出来视景体中的物体。但是如果我想在3D场景中规定一个区域,凡是在这个区域中的物体就能显示出来,非这个区域中的物体就要剪裁掉。常见的做法是调用ES的API进行一些数据的裁剪。但是这样对OpenGL ES这个状态机来说,状态的切换是很耗费性能。为何不用着色器来进行裁剪那。
废话不多说了,先说一下自定义裁剪需要的步骤。
1.首先将传递到顶点着色器中的顶点(该顶点不经过任何的变换)乘以自身的一个ModelMartix矩阵,这一步骤的操作,相信做过OpenGL ES的人就会明白,这是将顶点从模型坐标系转化到世界坐标系。因为在OpenGL ES中如果不加任何特殊的说明,自己在着色器中或者在附属语言中,定义一个位置点,这个位置点所在的坐标系是在世界坐标系中的,而OpenGL ES对坐标系是很敏感的,所以得转化到同一个坐标系进行数学计算。
vec4 ds = modelMartix*vec4(vPosition.xyz,1.0);
2.将转化后的顶点坐标传递到片元着色器中,这样就可以拿着这个坐标进行做事了,因为其转化过来的是世界坐标系下的顶点位置,然后自己规定一个立方体盒子,盒子内的显示,盒子外的不显示,看到这么简单的代码,是不是感觉原来写shader也是一件极其舒坦的事情那。
if(ds.y>=-20.0&&ds.y<=25.0){
gl_FragColor = texture2D(sTexture, vTextureCoord);
}else{
discard;
}