type
status
date
slug
summary
tags
category
icon
password
fullWidth
fullWidth
Unity的VideoPlayer在编辑时指定到某帧
问题描述
做舞蹈视频时需要将歌曲PV视频作为背景板,在编辑时希望视频停留在某一帧(为了好看!),然而,VideoPlayer组件的Inspector面板没有直接提供设置帧属性的选项。
主要原因
- 帧是运行时状态值,而非配置参数,Inspector面板主要用于编辑静态配置属性(如视频路径、播放速度等)。
- 设置帧需要视频已加载并解码(
isPrepared == true
),在编辑模式下,视频资源可能尚未加载。
- 跳转到特定帧需要解码前面的所有帧,在编辑器频繁更新会卡顿。
解决方法
扩展VideoPlayer的Inspector面板,增加编辑时跳转到指定帧的功能;把这个脚本放在Assets/Editor文件目录,会自动应用于场景中所有的VideoPlayer组件。
使用效果
.gif?t=1da92264-0ce5-8064-a300-f1b82c918879)
Unity内置管线保存渲染中间结果到RenderTexture
问题描述
在内置管线的卡通渲染中,有一步屏幕后处理效果为“暗部晕染”,需要拿到卡通渲染
ForwardPass
通道中根据diffuse
值计算出来的暗部遮罩,模糊后叠入原暗部;也即在对diffuseColor色阶离散化之前的计算结果要预存下来,为后处理的Pass通道所用。内置管线的限制
- Pass之间无法共享数据:内置管线的Pass是独立执行的,Pass 0的
SV_Target
输出(如Diffuse值)无法直接传递给Pass 1。
- 无法动态插入渲染步骤:内置管线没有可编程的渲染管线逻辑,无法在运行时插入自定义的渲染操作(如先渲染Diffuse到 RT,再使用RT做后续计算)。
- 缺少原生的Multi-Pass数据传递机制:Built-in 管线没有类似URP的
_CameraColorTexture
或HDRP的Render Graph资源管理,无法自动保存中间结果(如Diffuse值)。
解决方法
RenderTexture
作为显式的数据中转站:手动创建RT,用CommandBuffer
渲染到RT,再传给后续Pass。使用案例
多Pass的Shader
这是一个卡渲Shader,包含Diffuse值计算、主渲染和描边三个Pass;其中Diffuse值计算Pass的输出结果需要保存到
RenderTexture
。挂在摄像机上的Csharp脚本
创建一个挂在摄像机上的Csharp脚本,作用是:
- 动态创建
RenderTexture
,保存渲染中间数据。
- 通过
CommandBuffer
在特定时机(如CameraEvent.BeforeForwardOpaque
)插入到渲染流程。
- 传递RT数据给Shader的属性。
针对角色有多个
MeshRenderer
,且每个Renderer有多个Material
的情况,需要遍历每个Material
并在DrawRenderer
命令中指定submeshId
。在
OnRenderImage
中可将中间结果的RenderTexture
输出到窗口进行调试查看。编辑器扩展脚本
由于将
CommandBuffer
插入到流程中一般在OnEnable
中进行(因为OnEnable
是最早的可控初始化点之一,且可配合OnDisable
清理旧CommandBuffer
和RenderTexture
以避免内存泄漏),修改了Shader的属性后需要重新激活脚本才能生效,可创建一个编辑器扩展脚本,用于点击按钮刷新渲染。实现效果
亮部Mask输出测试


ShadowThreshold = 0.8

叠加渲染效果



- Author:Yuki
- URL:http://shirakoko.xyz/article/study-note
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts