您好,我正在尝试在 Unity 中使用 OnRenderImge 函数。当我打开 3D 项目时我成功了。但是当我使用 HD Renderer Pipeline 项目时,该功能不起作用。是交付功能还是其他什么?
最佳答案
使用高清渲染管道时它们会被删除。使用高清渲染管道时不会调用以下四个函数:
- 预剔除
- 预渲染
- OnPostRender
- OnRenderImage
Unity's forum 列出了它们被删除的原因:
就这些回调而言,它们提供了将额外渲染代码注入(inject) Unity 的方法。尝试将这些移植到 SRP 世界时出现的问题是多方面的。
使用这些的现有插件是通过非常非常深入的构建的 与 Unity 的隐含合约
- 假设 Camera.main 已设置
- 当前渲染目标设置在调用前“已知”
- 您正在使用旧版后处理(C++,少量脚本控制)
由高层统一调用
- 回调(通常)没有参数
- 正在使用什么相机等
- 设计为“原始”注入(inject)方法
- 我们有建议零售价,您可以做更多事情
- 回调(通常)没有参数
这些是在摄像机中间渲染时调用的。这通常很糟糕,因为我们 将配置一些渲染状态,然后用户代码将 改变这个状态(通过调用嵌套渲染,只是粉碎一些 帧缓冲状态)。这就是我们的大量错误的地方 积压从何而来。困难的部分是修复这里的任何错误 通常会导致针对隐式的、无记录的回归 行为。
- 始终被调用,即使您不想要或不需要它们也不会产生任何开销 原因
使用高清渲染管道时要使用什么?
注册 RenderPipeline.beginCameraRendering 和 RenderPipeline.beginFrameRendering 事件。这些是新的实验性功能,可以随时更改。
void OnEnable()
{
RenderPipeline.beginCameraRendering += BeginCameraRendering;
RenderPipeline.beginFrameRendering += BeginFrameRendering;
}
void OnDisable()
{
RenderPipeline.beginCameraRendering -= BeginCameraRendering;
RenderPipeline.beginFrameRendering -= BeginFrameRendering;
}
void BeginCameraRendering(Camera camera)
{
}
void BeginFrameRendering(Camera[] cameras)
{
}
关于c# - 关于Unity中的OnRenderImage函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660619/