一、投影模式 (Projection)
1. 透視模式 (Perspective)
-
原理:模擬人眼,近大遠小(錐形體視錐)
-
核心參數:
-
Field of View (FOV)
:垂直視場角-
典型值:第一人稱 60°-90°,駕駛艙 30°-45°
-
特效:FOV↑=視野變廣(魚眼效果),FOV↓=視野變窄(望遠鏡)
-
-
Clipping Planes
:-
Near
:近裁面(0.01-0.3,避免穿模) -
Far
:遠裁面(100-1000,過大影響性能)
-
-
2. 正交模式 (Orthographic)
-
原理:無視距離,物體恒定大小(立方體視錐)
-
核心參數:
-
Size
:視口高度的一半(單位:世界坐標)-
計算:若想顯示10單位高度區域 → Size=5
-
-
Clipping Planes
:同透視模式(控制Z軸范圍)
-
二、清除與背景 (Clear Flags & Background)
1. Clear Flags(幀緩存清除策略)
模式 | 清除顏色 | 清除深度 | 典型用途 |
---|---|---|---|
Skybox | √ | √ | 開放世界(需設置天空盒) |
Solid Color | √ | √ | 純色背景(太空/抽象場景) |
Depth Only | × | √ | UI攝像機必選 |
Don't Clear | × | × | 特殊效果(極少用) |
2. Background
-
僅當?
Clear Flags = Solid Color
?時生效 -
建議用深灰色(RGB:30,30,30)替代純黑避免色偏
三、渲染過濾 (Culling Mask)
-
本質:32位圖層掩碼(對應Layer面板的32個層)
-
操作邏輯:
-
// 代碼示例:只渲染UI層和Enemy層 camera.cullingMask = (1 << LayerMask.NameToLayer("UI")) | (1 << LayerMask.NameToLayer("Enemy"));
-
經典用例:
-
主攝像機:排除UI層
-
小地圖攝像機:僅顯示Terrain層
-
陰影攝像機:僅渲染Cast Shadows的物體
-
四、深度與渲染順序 (Depth)
-
核心規則:深度值大的攝像機后渲染(覆蓋先渲染的畫面)
-
多攝像機協作模板:
Camera_Main(場景渲染): Depth = 0 Culling Mask = Everything & ~UI // 排除UI層 Clear Flags = Skybox Camera_UI(界面渲染): Depth = 1 Culling Mask = UI Clear Flags = Depth Only // 保留場景顏色,只清深度
五、視口控制 (Viewport Rect)
-
歸一化坐標:[0,0]左下角 → [1,1]右上角
-
參數詳解:
-
X:視口左下角起始X坐標
-
Y:視口左下角起始Y坐標
-
W:視口寬度(0~1)
-
H:視口高度(0~1)
-
-
應用場景:
-
雙人分屏:
Player1: (0,0,0.5,1)
?+?Player2: (0.5,0,0.5,1)
-
小地圖:
(0.7,0.7,0.3,0.3)
-
六、目標紋理 (Target Texture)
工作流
-
創建Render Texture:
Assets > Create > Render Texture
-
綁定到Camera:拖入Camera組件的Target Texture槽
-
應用輸出:
-
3D材質:賦給MeshRenderer的材質
-
UI顯示:RawImage組件的Texture參數
-
高級技巧
// 動態創建渲染紋理
RenderTexture rt = new RenderTexture(512, 512, 16);
camera.targetTexture = rt;
// 完成后釋放資源
rt.Release();
七、坐標轉換(核心API)
1. 屏幕坐標 → 世界坐標
// 轉換到3D世界(z為攝像機前方距離)
Vector3 worldPos = camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,10) // z=10表示攝像機前方10單位
);
2. 世界坐標 → 屏幕坐標
// 用于UI跟隨3D物體
Vector3 screenPos = camera.WorldToScreenPoint(enemy.transform.position);
uiElement.transform.position = screenPos;
3. 射線檢測(物體拾取)
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, 100))
{Debug.Log("點擊了:" + hit.collider.name);
}
八、高級功能
1. 物理攝像機 (URP/HDRP)
-
Focal Length
:焦距(毫米)→ 控制FOV -
Sensor Size
:膠片尺寸 → 影響視野比例 -
Aperture
:光圈 → 控制景深強度
2. 攝像機堆棧 (URP專屬)
Base Camera(基礎場景)
? ↓
Overlay Camera 1(特效層)
? ↓
Overlay Camera 2(UI層)
-
優勢:比傳統Depth排序更節省性能
3. 回調事件
void OnPreCull() { /* 裁剪前調用 */ }
void OnPreRender() { /* 渲染前調用 */ }
void OnPostRender() { /* 渲染后調用 */ }