透视投影相机的near与far设置相隔过大引起的问题

例子:




    
    


 
 
 
 



主要需要注意我们开启了深度检测gl.enable(gl.DEPTH_TEST);.
本例中perspectCamera的near参数设置为1,相机的位置在10000000;
我们可以画出一个正方体。

透视投影相机的near与far设置相隔过大引起的问题_第1张图片
near=1时可以画出正方体

但是当我们把near参数设置为0.1时,画布上一片黑暗。

透视投影相机的near与far设置相隔过大引起的问题_第2张图片
near=0.1时画不出正方体

这是为什么呢?
可以确定是由near过小引起的, 那么near影响了什么呢?当然是投影矩阵
先来看看透视投影的矩阵运算

透视投影相机的near与far设置相隔过大引起的问题_第3张图片
透视投影矩阵

fovy为角度,aspect为比率,f为远距离,n为近距离
对比两者的投影矩阵

透视投影相机的near与far设置相隔过大引起的问题_第4张图片
near=1时的投影矩阵

透视投影相机的near与far设置相隔过大引起的问题_第5张图片
near=0.1时的投影矩阵

可以发现near=0.1时由-2变为-0.2, 那么乘以一个坐标向量[X,Y,Z,1]的值为什么呢?

透视投影相机的near与far设置相隔过大引起的问题_第6张图片
near=0.1时相乘

透视投影相机的near与far设置相隔过大引起的问题_第7张图片
near=1时相乘

相乘的结果即为 gl_position=[X,Y,Z,W],除以W为 [X/W,Y/W,Z/W,W](X/W,Y/W)即为canvas中定位的坐标。 Z/W为深度信息。
(1)当near=1时 Z/W=1-2/z
(2)当near=0.1时 Z/W=1-0.2/z
回到例子的代码我们可以发现相机的位置设置在10000000,导致了z值比较大,而gl_position为vec4类型时4个float类型,精度为小数点后7位,因而当near=0.1时Z/W=1-0.2/10000000=1,为1时深度检测超限不会绘制出。
解决方法
(1)关闭深度检测
透视投影相机的near与far设置相隔过大引起的问题_第8张图片
关闭深度检测可以画出正方体

(2)near值设大一点

你可能感兴趣的:(透视投影相机的near与far设置相隔过大引起的问题)