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

案例查看地址:点击这里

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


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



参与评论 您还未登录,请先 登录 后发表或查看评论
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

暮志未晚Webgl

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值