您的位置:首页 > 其它

27 WebGL的正确处理对象的前后关系

2017-06-02 15:11 211 查看
案例查看地址:点击这里
正常的话,前面的图形挡住后面的图形,这是正常的人眼看到的效果,但是图形绘制出来,不会考虑这些前后关系什么的,只是会按照绘制的前后拜访而已。



如果我们将前面案例的三角形最后面的和最前面的三角形的z轴调换一下,改成从前面的三角形开始绘制,就会出现这样的效果,太辣眼睛了!所以,我们需要方法处理掉这种问题。
如何解决:我们需要通过gl.enable()方法开启相关的功能。



通过这个方法:
(1)开启隐藏面消除功能。
gl.enable(gl.DEPTH_TEST);(2)在绘制之前,清除深度缓冲区。
gl.clear(gl.DEPTH_BUFFER_BIT);深度缓冲区是一个中间对象,其作用就是帮助WebGL进行隐藏面消除。如果要将隐藏面消除,那就必须知道每个几何图形的深度信息,而深度缓冲区就是用来存储深度信息的。由于深度放心通常是Z轴方向,所以有时候我们也称它为Z缓冲区。



所以,代码将修改为
//开启隐藏面清除
gl.enable(gl.DEPTH_TEST);
//清空颜色和深度缓冲区
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
与gl.enable()函数对应的还有gl.disable()函数,其规范如下所示,前者启用摸个功能,后者则禁用之。



深度冲突
隐藏面消除是WebGL的一项复杂而又强大的特效,在绝大多数情况下,它都能很好地完成任务。然而,当几何图形或物体的两个表面极为接近时,就会出现新的问题,使得表面看上去斑斑驳驳的,这种现象被称为深度冲突(Z fighting)。



之所以会产生深度冲突,是因为两个表面过于接近,深度缓冲区有限的精度已经不能区分哪个在前哪个在后了。严格地说,如果创建三位模型阶段就对顶点的深度值加以注意,是能够避免深度冲突的。但是,当场景 中有多个运动着的物体时,实现这一点几乎是不可能的。
WebGL提供一种被称为多边形偏移(polygon offset)的机制来解决这个问题。该机制将自动在Z值上加一个偏移量,偏移量的值由物体表面相对于观察者视线的角度来确定。
实现起来分两步:
(1)启用多边形偏移。
gl.enable(gl.POLYGON_OFFSET_FILL);(2)在绘制之前指定用来计算偏移量的参数。
gl.polygonOffset(1.0,1.0);


// 开启多边形偏移
gl.enable(gl.POLYGON_OFFSET_FILL);
// 绘制的时候分两次绘制产生冲突
gl.drawArrays(gl.TRIANGLES, 0, n / 2); // 绿色三角形
gl.polygonOffset(1.0, 1.0); // 设置偏移量
gl.drawArrays(gl.TRIANGLES, n / 2, n / 2); // 黄色三角形

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: