我正在读取场景的深度缓冲区,但是当我旋转相机时,我注意到向屏幕边缘返回的深度更接近相机。我认为撞击的角度对深度缓冲区有影响,但是当我在帧缓冲区中绘制一个四边形时,我不希望这种情况发生(这实际上不是这种情况,但这总结了我的需要)。
我用以下方法线性化深度:
float linearize(float depth) {
float zNear = 0.1;
float zFar = 40.0;
return (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
}
我想出以下来纠正这个问题,但它还不太正确。45.0 是相机的垂直角度/2. side 是距屏幕中心的空间。
const float angleVert = 45.0 / 180.0 * 3.17;
float sideAdjust(vec2 coord, float depth) {
float angA = cos(angleVert);
float side = (coord.y - 0.5);
if (side < 0.0) side = -side;
side *= 2.0;
float depthAdj = angA * side;
return depth / depthAdj;
}
为了显示我的问题,用相机前平面的深度结果绘制:
c
/ | \
/ | \
/ | \
closer further closer
is what I have, what I need:
c
| | |
| | |
| | |
even even even