摄像机相对渲染
与内置渲染管线相比,摄像机相对渲染 (Camera-relative rendering) 可以让高清渲管线 (High Definition Render Pipeline, HDRP) 以更稳健和数值更稳定的方式渲染远处的游戏对象(具有较大的世界空间坐标)。
随着数字变大,浮点数的绝对精度会降低。这意味着,游戏对象距离场景的原点越远,游戏对象坐标越不精确。远处游戏对象上彼此靠近的网格面可能出现在同一个位置并产生 Z 冲突瑕疵。为解决此问题,摄像机相对渲染会将世界原点替换为摄像机的位置。
使用摄像机相对渲染
默认情况下会在 ShaderConfig.cs 文件中启用摄像机相对渲染(在 Project 窗口中,选择 Packages > Runtime > ShaderLibrary,然后单击 ShaderConfig.cs)。要禁用此功能,请将 CameraRelativeRendering
设置为 0
,然后生成 Shader include 语句以更新 ShaderConfig.cs.hlsl 文件(菜单:Edit > Render Pipeline 并单击 Generate Shader Includes)。
摄像机相对渲染的工作原理
在任何其他几何变换影响游戏对象和光源之前,摄像机相对渲染过程通过对世界空间摄像机位置取反来移动游戏对象和光源。然后,该过程将世界空间摄像机位置设置为 0,并相应修改所有相关矩阵。
如果查看预先构建的 HDRP 着色器的源文件,则视图和视图投影矩阵是相对于摄像机以及光源和表面位置的。HDRP 着色器中的大多数世界空间位置也是相对于摄像机的。
例外情况:_WorldSpaceCameraPos
始终不是相对于摄像机的,因为 HDRP 将其用于坐标空间转换。
示例
如果启用摄像机相对渲染:
GetAbsolutePositionWS(PositionInputs.positionWS)
返回不是相对于摄像机的世界空间位置。GetAbsolutePositionWS(float3(0, 0, 0))
返回等于_WorldSpaceCameraPos
的摄像机世界空间位置。GetCameraRelativePositionWS(_WorldSpaceCameraPos)
返回float3(0, 0, 0)
。
如果禁用摄像机相对渲染:
GetAbsolutePositionWS()
和GetCameraRelativePositionWS()
返回传入的位置,不做任何修改。