Unity——URP相机详解

2021版本URP项目下的相机,一般新建一个相机有如下组件

1:Render Type(渲染类型)

有Base和Overlay两种选项,默认是Base选项

        Base:主相机使用该种渲染方式,负责渲染场景中的主要图形元素

        Overlay(叠加):使用了Oveylay的相机会把它渲染出的图形叠加到其他相机之上,使用方法是在主摄像机的Stack部分添加该相机,如下图

2:Projection(投影方式)

把三维场景投影到二维屏幕上的过程,有Perspective和Orthoraphic两种方式

        Perspective(透视投影):远小近大的效果,可以通过调节Field of View来调节视野大小

        

        Orthographic(正交投影):没有距离之分,没有Field of View

效果如下

视锥体如下:

        Near Clipping Planes(近裁剪空间) :相机视锥体靠近相机一侧的平面,在这个平面之前,物体就会被裁剪,不会被渲染,

        Far Clipping Plane(远裁剪空间):相机视锥体远离相机一侧的平面,在这个平面之后,物体会被裁剪

调整Near,前面的Cube将不被渲染

3:Rendering(渲染方式)

        Renderer:渲染器,URP的渲染管线可选

        Post Processing:后处理,可选择开启和关闭

        Clear Depth: 如果启用 "Clear Depth",则在每一帧开始时,深度缓冲区将被清除,而如果禁用 "Clear Depth",则深度缓冲区的内容将保留,这样可以在多个相机渲染过程中保持一致的深度信息,适用于一些特殊的渲染效果和场景。

        Render Shadow:该相机要不要渲染影子出来

        Culling Mask(层级渲染选项):包含或忽略要由摄像机渲染的对象层,让相机渲染哪些图层,而忽略其他图层,

        Occlusion Culling(遮挡剔除):防止 Unity 为那些被其他游戏对象完全挡住(遮挡)的游戏对象执行渲染计算,可选下面这些

         比如没有开启遮挡剔除,所有没有被摄像机渲染到的物体还是会被渲染

而开启了遮挡剔除后,摄像机看不到的物体将不会被渲染

4:Environment/Volume(环境/体积)

在这里可以设置Update Mode(体积的更新方式)、Volume Mask(体积的遮罩),Volume Trigger(体积的触发方式)

5:Universal Additional Camera Data(添加相机数据)

Universal Additional Camera Data 组件允许 URP 扩展和覆盖 Unity 标准 Camera 组件的功能和外观。

如果不使用脚本来控制和自定义 URP,则无需对 Universal Additiona Camera Data 组件执行任何操作。

如果要使用脚本来控制和自定义 URP,则可以在如下所示的脚本中访问摄像机的 Universal Additional Camera Data 组件:

Class UniversalAdditionalCameraData | Universal RP | 12.1.1 (unity3d.com)

var cameraData = camera.GetUniversalAdditionalCameraData();
### 如何在 Unity URP 中实现水面效果 #### 使用官方示例项目 Boat Attack Unity URP 提供了一个名为 Boa tAttack 的优秀官方示例项目,其中包含了详细的水体渲染实现方法。此项目不仅展示了基础的水体表面绘制技巧,还深入探讨了波形的设计思路[^1]。 #### 屏幕空间反射 (SSR) 对于更逼真的水面效果而言,屏幕空间反射是一项关键技术。通过特定解决方案如 `Unity-ScreenSpaceReflections-URP` 可以为基于通用渲染管线的应用程序添加高质量的反射特性。该方案利用延迟着色模式下的深度缓冲区来计算物体间的相互映射关系,从而达到真实的镜面反射视觉体验[^2]。 ```csharp using UnityEngine; public class ScreenSpaceReflection : MonoBehaviour { private void OnRenderImage(RenderTexture src, RenderTexture dest){ Graphics.Blit(src,dest,new Material(Shader.Find("Hidden/Ssr")),0); } } ``` #### 基本水体交互系统的构建 创建一个简单的互动式水域环境涉及多个层面的工作: - **图形渲染**:负责呈现平滑流动且具有适当透明度变化的液体外观; - **物理模拟**:赋予虚拟水流自然的行为特征比如波动、碰撞响应等; - **用户输入处理**:允许玩家角色或其他对象与场景中的液态成分发生接触并触发相应事件; 具体来说,在编写脚本时需考虑如下要点: - 定义公共变量用于调整参数(例如颜色、折射率) - 调用内置函数设置材质属性 - 编写自定义着色器以增强表现力 以下是简化版 C# 代码片段展示如何初始化此类组件实例: ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshRenderer))] public class WaterSurfaceInteraction : MonoBehaviour { public Color waterColor = new Color(.2f,.7f,1f,.85f); MeshRenderer meshRenderer; void Start(){ meshRenderer = GetComponent<MeshRenderer>(); var material = new Material(Shader.Find("Custom/Water")); material.SetColor("_WaterColor",waterColor ); meshRenderer.material = material ; } } ``` #### 高级水体材质——几何波设计 为了获得更为细腻的效果,可采用双层法线贴图策略。即在同一帧内先后读取两组经过变换后的 UV 坐标所指向的不同位置处的数据,并将其混合起来作为最终输出值的一部分。这种方法能够有效提升细节层次感而不显著增加性能开销[^5]。 ```hlsl // HLSL Shader Code Snippet float4 animUV=uv0.xyxy*float4(1,1,0.5,0.5)+ float4(normalize(_Direction.xy), normalize(_Direction.zw))* _WaveSpeed*_TexWaveSpeed*_Time.y; float4 n1=SAMPLE_TEXTURE2D(_BumpMap, sampler_BumpMap, animUV.xy); float4 n2=SAMPLE_TEXTURE2D(_BumpMap, sampler_BumpMap, animUV.zy); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laker404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值