opengl中深度冲突问题以及几种可能的解决方案

opengl中遮挡关系是通过z缓冲区+深度测试来实现的,而z缓冲区一般都有位数限制,通常为24位,也有32位。

这样在进行遮挡查询的时候,如果两个面距离非常近的话,那么这两个面的z值就可能会由于非常小而产生交替出现的现象,称为z-fighting,这就严重影响渲染质量。

通常的解决方法:

1.最常用的就是使用glPolygonOffset函数,对于两个非常近的面或者model我们可以将其分开渲染,先渲染一个然后通过glPolygonOffset函数设置一个偏移之后再渲染另一个,

   这样的结果就是在一个的深度值写入深度缓冲之后,另一个可以加一个偏移量来保证在深度测试的时候两者的深度值达到明显区别的程度,从而正确的绘制两个object。

2.通常我们在计算depth的时候并不使用线性计算,即计算出的depth并非是点的z坐标线性转换而来,而是使用非线性变换,Fdespth = (1/z - 1/near) / (1/far - 1/near),这样就能保证在离近切面近的部分depth值更精确,当然我们也很容易推出,当把near值适当增大时,可以更好的保证距离较远处的精度值,所以可以通过增大near值来解决,但是这种方法对于解决单模型渲染还是效果不错的,但是对于多模型渲染也会有问题。

3.提升硬件精度,主要是提升z缓冲区的位数来达到增加精度的目的,这对于要求较高的场合确实是很好的选择。


你可能感兴趣的:(OpenGL,z-fighting,glPolygonOffset)