首页 > 解决方案 > 如何线性化金属的深度?

问题描述

我尝试在我贡献的 3D 引擎中实现阴影映射。我已经成功地从光线的角度渲染了场景,但我缺乏深度线性化算法的实现。因此,我用来决定物体是否在阴影中的偏差不能很好地概括。

我知道我需要将范围 [zNear, zFar] 的对数值映射到线性 [0, 1] 范围,但我不知道如何

这是我使用的投影矩阵

public static func perspectiveProjectionRightHand(fovyRadians: simd_float1,
                                                      aspect: simd_float1,
                                                      nearZ: simd_float1,
                                                      farZ: simd_float1) -> simd_float4x4 {
    let yScale = 1 / tan(fovyRadians * 0.5)
    let xScale = yScale / aspect
    let zScale = farZ / (nearZ - farZ)
    return simd_float4x4(rows: [simd_float4(yScale, 0, 0, 0),
                                    simd_float4(0, xScale, 0, 0),
                                    simd_float4(0, 0, zScale, nearZ * zScale),
                                    simd_float4(0, 0, -1, 0 )])
}

标签: metal

解决方案


推荐阅读