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

来源:互联网 发布:淘宝客代理 编辑:程序博客网 时间:2024/06/07 18:44

正常的话,前面的图形挡住后面的图形,这是正常的人眼看到的效果,但是图形绘制出来,不会考虑这些前后关系什么的,只是会按照绘制的前后拜访而已。


如果我们将前面案例的三角形最后面的和最前面的三角形的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); // 黄色三角形



原创粉丝点击