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); // 黄色三角形
正常的话,前面的图形挡住后面的图形,这是正常的人眼看到的效果,但是图形绘制出来,不会考虑这些前后关系什么的,只是会按照绘制的前后拜访而已。
如果我们将前面案例的三角形最后面的和最前面的三角形的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); // 黄色三角形
相关文章推荐
- 数据库-ADONET-在数据集DataSet中使用关系对象DataRelation处理关系
- ios学习二:处理类和对象的关系(来源objective-c基础教程)
- Django 的 model 处理,它是一种 ORM (Object Relation Mapping, 对象与关系的映射)
- Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多
- C++全局对象初始化依赖关系处理
- 自己动手实现简单对象关系库谈到异常的处理与抛出
- 正确处理人际关系,给自己做无形的投资
- 使用 ibatis 处理复杂对象数据关系的实例
- Error:java: 服务配置文件不正确, 或构造处理程序对象javax.annotation.processing.Processor: Provider org.antlr.v4.runtime
- 使用 ibatis 处理复杂对象数据关系的实例
- 正确处理好工作任务和自身技术发展的关系
- 使用 ibatis 处理复杂对象数据关系的实例
- 重构系列之对象间的重构:《重构》处理概括关系
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- 使用 ibatis 处理复杂对象数据关系的实例
- 正确处理职场人际关系
- 正确处理好工作任务和自身技术发展的关系
- SSM框架之spring学习1——创建对象,处理依赖关系
- 正确处理改革发展稳定的关系
- 学习“要件审判九步法”,正确处理五个关系 z