metal - 如何线性化金属的深度?
问题描述
我尝试在我贡献的 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 )])
}
解决方案
推荐阅读
- node.js - 如何检查交易是否被取消
- android-studio - Android 许可证状态未知
- sparql - 使用属性和 itemlabel 查询 wikidata
- java - 如何在写入过程中出现异常回滚/恢复 IO 操作?- 爪哇
- java - 如何在 ElementType.PARAMETER 注释上使用方面
- unity3d - 如何在脚本的可寻址窗口中分配可寻址标签
- python - Python:查找文件中最长的句子
- c# - HttpWebRequest.GetRequestStream 返回的流不会立即在 .NET Core 中发送数据
- sql-server - 多个外键到单个主键关系数据库
- regex - 匹配特定单词及其后成对括号之间的字符串,支持单个嵌套级别,但有异常