Z - Fighting 和 Depth-bias
Depth-bias操作在clipping之后进行实施,所以depth-bias对几何clipping没有影响。
另外需要注意的是:对一个给定体元(primitive),bias值是一个常量,在进行差值操作之前,它施加在每个顶点上。
偏移操作都是32位浮点运算,还有Bias不能施加在点以及线体元上(除了线框模式的线段)。
***************************************************************************************************************
OpenGL,或者D3D 的深度缓存都存在精度问题,在最新的Nvidia GF8 系列显卡中已经开始应用float point depth buffer. 而在此之间,深度缓存其实只有位平面的概念. 这随API的不同,都需要指定后缓存深度缓存精度, Depth ,我一般使用24位,也就是D3D中常见的 D24S8. 但除非你是用浮点,否则都会有精度损失的问题,这种情况总是发生在2个几乎共面的片面,他们投影在后裁减平面时都会被赋予一个深度(当然,如果深度缓存可写的话),而上面已经说过,目前来说,深度只是位平面, 你可以把他假设为这样的形势
depth w
0 [near_clip, near_clip + 0.1]
1 [near_clip + 0.1, near_clip +0.2]
2 [near_clip + 0.3 , near_clip +0.4]
........
max [far_clip - 0.1, far_clip]
上面假设硬件的最小深度单元 r = 0.1
那么将会出现这样的问题.
当2个片元距离近裁减平面 w 落在同一个区间的时候,他们的深度是相等的. 最终你所看到的结果,就是下面的这种样子:
注意到蓝色线框里面.
要解决这个问题, 你只要google 或者去 beyond3d,等论坛,搜索 depth fighting ,得到的答案往往就是设置深度偏移. OpenGL : Polygon offset. D3D: Depth Bais.
拿OpenGL 来说,就是对有存在深度冲突的2个 Mesh Object A,B如下方式渲染.
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0.0f,-1.0f);
B.Render();
glDisable(GL_POLYGON_OFFSET_FILL);
这是一个不错的方法,但是实际操作起来很麻烦,而且没有效率. 注意到,你必须一先一后的渲染这2个对象, 拿上图来说,我需要在MAX 中把手套和手臂脱离,形成一个独立的节点,然后我起码需要新建立2个顶点缓存,并在渲染的过程中设置2次.这对于带宽是个不小的代价.所以我不是很赞成这样去处理,当然,有的时候无法避免了,也会如此..
如果避免发生Z-Fighting 才是关键. 注意到上面的depth - w 的位平面对应关系. 由于硬件都只能支持一定的深度格式,也就是说,Depth bits 是一定的,假为 D.而顶点的投影深度则毫无限制,他可以是 near_clip ---> far_clip 的任意一个浮点数.因此
dw/D = (far_clip - near_clip)/near_clip;
从上面可以看出, 要想dw 更精确,那么 near_clip 必然要更大(适用范围是far_clip >> near_clip).
上面那张存在depth-fighting 的截图当时的情况是 near_clip :0.0001 far_clip : 64000.0
下面的是在near_clip 0.1 far_clip 不变.
继续提高定点投影深度,也不会出现难看的深度冲突了.
转自:http://www.cppblog.com/sunraiing9/archive/2009/03/27/78018.html
最新文章
- TortoiseGit:记住用户名和密码
- Java时间类型转换
- 如何找到所有HTML Select 标签的选中项?
- 释放用完的Excel COM组件
- jmeter笔记1
- ubuntu ipv6网络电视(avplay)
- centreon 降低rrd磁盘读写
- android-exploitme(一):生成apk
- PHP学习笔记02——简易计算器
- ubuntu thrift 0.9.3编译安装
- IOS UINavigationController 操作相关集合
- 九度OJ 题目1534:数组中第K小的数字(二分解)
- eclipse不能写入classpath
- Zepto源码分析-架构
- Oracle截取JSON字符串内容
- 配置 Confluence 6 安全的最佳实践
- C++中析构函数的作用
- Nmap 7.70新增功能——扫描主机所有IP
- 查看CUDA和cuDNN的版本号
- android休眠唤醒驱动流程分析【转】
热门文章
- 如何成为一名合格甚至优秀的个人草根站长(转载自ChinaZ)
- How to Failover the ‘Cluster Group’
- 使用C#和.NET的原因
- 剑指offer习题集1
- XE6移动开发环境搭建之IOS篇(3):配置虚拟机,设置Mac安装环境(有图有真相)
- UNIX网络编程-基本API介绍(一)
- day01-02--数据库概念介绍
- /etc/resolv.conf overwritten. Redhat/Centos
- spring mvc定时任务的简单使用
- 如何定义DATATABLE,同时赋值