首页/新闻资讯/正文详情

游戏内置相机模式与景深虚化算法:中秋合影功能实现

发布时间:2026/9/27 18:40:36 来源:云帆数科 栏目:资讯中心
游戏内置相机模式与景深虚化算法:中秋合影功能实现
游戏内置相机模式与景深虚化算法中秋合影功能实现在中秋节日活动或大型社交版本上线期间“拍照模式”Photo Mode / 相机合影功能是激发玩家社交传播、提高游戏活跃度的核心功能之一。玩家希望在明月中秋之夜与帮派好友或 NPC 角色并肩而立自由调节焦距、光圈、旋转构图拍出具有单反级大光圈虚化Bokeh Depth of Field与节日氛围感的高清游戏截图。很多项目的内置拍照功能往往只是简单地隐藏 UI 并调用ScreenCapture.CaptureScreenshot()导致拍出来的照片缺乏层次感与光学真实感。在引擎渲染管线中实现一套高质量的实时景深虚化DoF与单反相机物理参数模拟系统是提升游戏视觉质感的关键环节。光学物理模型与弥散圆Circle of Confusion, CoC计算真实单反相机的景深效果由薄透镜成像定律Thin Lens Equation决定。当物体不处于对焦平面Focus Plane时物点在传感器上成像为一个圆形光斑称为弥散圆Circle of Confusion, CoC。CoC 的物理直径 $c$ 可通过焦距 $f$、光圈数 $N$F-stop、对焦距离 $d_{\text{focus}}$ 以及物体实际深度 $z$ 计算得出$$c \frac{f^2}{N \cdot (d_{\text{focus}} - f)} \cdot \frac{|z - d_{\text{focus}}|}{z}$$在实时着色器中我们通常将该物理公式转化为屏幕归一化坐标下的 CoC 半径值并将景深解耦为**近景虚化区Near Field与远景虚化区Far Field**分别计算以防止前景物体的颜色错误溢出到背景深色区域Foreground Bleeding Artifacts。// HLSL: 物理相机 CoC 计算 Pass (CameraCoC.hlsl) #ifndef PHYSICAL_CAMERA_COC_INCLUDED #define PHYSICAL_CAMERA_COC_INCLUDED #include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl Texture2D _CameraDepthTexture; SamplerState sampler_CameraDepthTexture; CBUFFER_START(PhysicalCameraParams) float _FocalLength; // 镜头焦距 (米如 0.05 代表 50mm) float _ApertureFStop; // 光圈 F 值 (如 1.4, 2.8) float _FocusDistance; // 对焦距离 (米) float _MaxCoCRadius; // 最大弥散圆像素半径 float4 _ZBufferParamsCopy; CBUFFER_END // 计算线性真实深度 (米) float GetLinearDepth(float rawDepth) { return LinearEyeDepth(rawDepth, _ZBufferParamsCopy); } // 片元着色器输出 CoC 因子到 R16G16F 纹理 (x: 远景 CoC, y: 近景 CoC) float2 FragCalculateCoC(float2 uv : TEXCOORD0) : SV_Target { float rawDepth _CameraDepthTexture.SampleLevel(sampler_CameraDepthTexture, uv, 0).r; float z GetLinearDepth(rawDepth); // 计算透镜孔径直径 A f / N float apertureDiameter _FocalLength / _ApertureFStop; // 计算弥散圆直径 (薄透镜近似公式) float coc (apertureDiameter * _FocalLength * abs(z - _FocusDistance)) / (_FocusDistance * (z - _FocalLength) 1e-5); // 映射至屏幕像素空间 float pixelCoC (coc / 0.036) * _ScreenParams.x; // 假设 36mm 全画幅传感器底片 pixelCoC clamp(pixelCoC, 0.0, _MaxCoCRadius); float farCoC 0.0; float nearCoC 0.0; if (z _FocusDistance) { // 远景虚化 farCoC pixelCoC; } else { // 近景虚化 nearCoC pixelCoC; } return float2(farCoC, nearCoC); } #endif多边形光斑模拟Gather-based Circular / Hexagonal Bokeh Blur传统的双向高斯模糊虽然计算快速但只能产生雾状的平滑模糊完全失去了大光圈下明亮光源形成的晶莹剔透的多边形/圆形光斑Bokeh。高质量景深通常采用基于收集Gather-based的圆盘或六边形泊松采样Poisson Disk Sampling / Golden Spiral。在片元着色器中对采样点的 HDR 颜色进行亮度加权Highlight Boost使得高光区域能够放大为璀璨的节日光斑。// HLSL: 高质量圆盘光斑收集模糊 Pass #define SAMPLE_COUNT 32 static const float2 GoldenSpiralSamples[SAMPLE_COUNT] { float2(0.000, 0.000), float2(0.125, 0.216), float2(-0.216, 0.125), float2(0.245, -0.245), float2(-0.353, -0.204), float2(0.380, 0.285), // ... 黄金螺旋泊松圆盘采样点分布 float2(-0.707, 0.707), float2(0.866, -0.500), float2(-0.950, -0.312) }; Texture2D _MainTex; SamplerState sampler_MainTex; Texture2D _CoCTexture; SamplerState sampler_CoCTexture; float4 FragGatherBokeh(float2 uv : TEXCOORD0) : SV_Target { float2 centerCoC _CoCTexture.SampleLevel(sampler_CoCTexture, uv, 0).xy; float effectiveCoC max(centerCoC.x, centerCoC.y); if (effectiveCoC 0.5) { // 焦点清晰区域直接返回原图跳过昂贵的循环采样 return _MainTex.SampleLevel(sampler_MainTex, uv, 0); } float4 accColor 0; float totalWeight 0; [unroll(SAMPLE_COUNT)] for (int i 0; i SAMPLE_COUNT; i) { float2 offset GoldenSpiralSamples[i] * effectiveCoC * _ScreenParams.zw; float2 sampleUV uv offset; float4 color _MainTex.SampleLevel(sampler_MainTex, sampleUV, 0); float2 sampleCoC _CoCTexture.SampleLevel(sampler_CoCTexture, sampleUV, 0).xy; // 深度权重混合抑制近景向远景的溢色瑕疵 float sampleRadius max(sampleCoC.x, sampleCoC.y); float weight saturate((sampleRadius - length(offset * _ScreenParams.xy)) 1.0); // HDR 高光增益突出中秋月光与灯笼的晶莹光斑 float luminance dot(color.rgb, float3(0.2126, 0.7152, 0.0722)); float highlightFactor 1.0 pow(saturate(luminance - 0.8), 2.0) * 5.0; accColor color * (weight * highlightFactor); totalWeight weight * highlightFactor; } return accColor / (totalWeight 1e-4); }相机控制器与高分辨率截屏管线设计为了给玩家提供类似专业相机的操控体验客户端封装了完整的对焦测距射线检测Tap-to-Focus与无 UI 纯净超清截屏管线。using UnityEngine; using System.IO; public class GamePhotoStudioController : MonoBehaviour { [Header(相机镜头硬件参数)] [SerializeField] private Camera photoCamera; [Range(0.024f, 0.200f)] [SerializeField] private float focalLength 0.085f; // 85mm 人像黄金焦段 [Range(1.2f, 16.0f)] [SerializeField] private float apertureFStop 1.8f; // F1.8 大光圈 [SerializeField] private float focusDistance 3.5f; [Header(滤镜与后处理)] [SerializeField] private Material dofMaterial; void Update() { // 玩家点击屏幕自动对焦 (Tap to Focus) if (Input.GetMouseButtonDown(0)) { Ray ray photoCamera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100.0f)) { focusDistance Vector3.Distance(photoCamera.transform.position, hit.point); UpdateCameraParameters(); } } } public void UpdateCameraParameters() { dofMaterial.SetFloat(_FocalLength, focalLength); dofMaterial.SetFloat(_ApertureFStop, apertureFStop); dofMaterial.SetFloat(_FocusDistance, focusDistance); } public void CaptureUltraHDPhoto(int superSamplingMultiplier, string saveFileName) { int width Screen.width * superSamplingMultiplier; int height Screen.height * superSamplingMultiplier; var rt RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGB32); photoCamera.targetTexture rt; photoCamera.Render(); RenderTexture.active rt; var screenshot new Texture2D(width, height, TextureFormat.RGB24, false); screenshot.ReadPixels(new Rect(0, 0, width, height), 0, 0); screenshot.Apply(); photoCamera.targetTexture null; RenderTexture.active null; RenderTexture.ReleaseTemporary(rt); // 异步将截屏编码并保存到本地相册 byte[] bytes screenshot.EncodeToPNG(); Destroy(screenshot); File.WriteAllBytes(saveFileName, bytes); Debug.Log($[PhotoMode] UltraHD Photo saved to {saveFileName}); } }在中秋活动场景中通过将 85mm 人像长焦镜头模型、F1.8 大光圈虚化以及圆盘光斑算法深度集成玩家拍摄中秋月下合影时远处的满月与灯笼能够自然化作如梦似幻的圆形光斑而近处的人物发丝与服饰细节清晰锐利大幅提升了玩家在社交媒体上的分享欲望与画面口碑。

相关推荐

工程师的技术长跑:在对抗熵增中找寻内心的秩序
工程师的技术长跑:在对抗熵增中找寻内心的秩序

工程师的技术长跑:在对抗熵增中找寻内心的秩序在现代互联网与高科技产业的高压节奏中,许多技术从业者常把职业生涯视作一场又一场令人精疲力竭的“百米冲刺”: 追逐着一个又一个稍纵即逝的技术风口;疲于应付每天开不完的敏捷会议、… · 2026/9/26 4:35:09

SOM自组织映射神经网络实战:从原理到聚类可视化与参数调优
SOM自组织映射神经网络实战:从原理到聚类可视化与参数调优

简介:SOM v3.3.3压缩包提供了一套包含核心脚本、运行库、可执行程序与演示视频的完整组件,适合需要部署、升级或调试该版本模块的技术人员使用。包内共275个文件,压缩后约68.32MB,其中196个lua脚本承担主要业务逻辑,22… · 2026/9/26 4:35:03

楚慧杯初赛Writeup:从SQL注入绕WAF到RSA共模攻击的实战复盘
楚慧杯初赛Writeup:从SQL注入绕WAF到RSA共模攻击的实战复盘

第十届"楚慧杯"初赛结束那一刻,我们队的共享文档里躺着19道题的截图和6个还没试完的payload。湖北省网络与数据安全实践能力竞赛的线上赛跟往年一样,坑不少,送分题也不少,整体做下来比较顺手,但最后复盘时发… · 2026/9/26 4:35:03

爱站小工具源码下载后如何防黑?3个实战补丁
爱站小工具源码下载后如何防黑?3个实战补丁

爱站小工具源码下载后如何防黑?3个实战补丁 别再用那些花里胡哨的模板网站撑门面了。看着好看,其实里面全是坑,稍微懂点技术的攻击者,三分钟就能把你的后台密码挖出来。很多老板觉得买个“爱站小工具”源码,改改颜色就上线,结果网站被挂马、被注入,排… · 2026/9/27 18:40:34

【AI模型】IDE-ClaudeCode 配 TaoToken:settings.json 骨架与报错排查
【AI模型】IDE-ClaudeCode 配 TaoToken:settings.json 骨架与报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:40:13

为了薅一个月 Codex 免费试用,我把 TaoToken 配置折腾明白了
为了薅一个月 Codex 免费试用,我把 TaoToken 配置折腾明白了

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:40:09

3个国内优秀网站推荐案例揭秘安全最佳实践
3个国内优秀网站推荐案例揭秘安全最佳实践

3个国内优秀网站推荐案例揭秘安全最佳实践 备案流程一头雾水?很多站长看着工信部系统里的状态栏发呆,明明代码写完了,域名解析也配好了,网站却迟迟打不开。这背后往往不是备案本身的问题,而是你在安全配置上踩了坑。今天咱们不聊虚的,直接拆解三个… · 2026/9/27 18:40:07

Python做网站吗?老手拆解3步避坑完整流程
Python做网站吗?老手拆解3步避坑完整流程

Python做网站吗?老手拆解3步避坑完整流程 找建站公司报价三万五,转头自己折腾花三千?别笑,太多创业团队负责人都栽在这一步。我干这行十年,见过太多人因为不懂技术,被销售话术带偏,最后花了大钱却买了个难用的壳子。今天不聊虚的,直接拆解… · 2026/9/27 18:39:54

2026企业级智能体选型指南:OpenClaw权限管控难题与TaoToken统一接入实践
2026企业级智能体选型指南:OpenClaw权限管控难题与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:39:53

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码