WaitForEndOfFrame 和 OnRenderImage 一样吗?

Fat*_*tie 2 shader unity-game-engine

在 Unity 中,是 WaitForEndOfFrame

void Update() 
{
  StartCoroutine(_c());
}

IEnumerator _c() 
{
  yield return new WaitForEndOfFrame();
  BuildTexturesForExample();
}
Run Code Online (Sandbox Code Playgroud)

等同于OnRenderImage

void OnRenderImage() 
{
  BuildTexturesForExample();
}
Run Code Online (Sandbox Code Playgroud)

(不言而喻,两个调用中最小/无用的统一 doco 没有帮助。)

如果不是,什么是“之后”OnRenderImage直到WaitForEndOfFrame被调用?

有没有人有比较使用两者的经验?

安全更换????

你能一直安全地更换一个WaitForEndOfFrame与模式OnRenderImage1

这是怎么回事?


1 (当然,gizmos/ongui 无关紧要。)

der*_*ugo 5

我想我刚刚找到了真正的答案 OnPostRender

OnPostRender在相机渲染其所有对象后调用。如果你想在所有摄像头和 GUI 渲染后做一些事情,使用WaitForEndOfFrame协程。

所以(除了我的想法和ExecutionOrder使它看起来/听起来像)Render 块中的所有方法(除了OnGUIand OnDrawGizmos)都是在每个 Camera 的基础上调用的,并且还要注意

OnPostRender:仅当脚本附加到相机并启用时才会调用此函数。

或者

OnRenderImage:此消息发送到所有附加到相机的脚本。

它的目的是后处理(我只通过查看示例了解它们的工作方式。),因此它实际上需要 2 个参数

OnRenderImage(RenderTexture src, RenderTexture dest)
Run Code Online (Sandbox Code Playgroud)

所以你可以dest在接收输入(src)后用一些渲染效果覆盖输出纹理(),如他们的例子

Material material;

private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
    // Copy the source Render Texture to the destination,
    // applying the material along the way.
    Graphics.Blit(source, destination, material);
}
Run Code Online (Sandbox Code Playgroud)

还有例如OnRenderObject被称为上所有GameObjects(MonoBehaviourS)不仅是Camera。再次,直到我看到这个例子,我才真正理解它的作用(或者是什么使它与 不同OnRenderImage)。但这里的例子有帮助:

void OnRenderObject()
{
    // Render different meshes for the object depending on whether
    // the main camera or minimap camera is viewing.
    if (Camera.current.name == "MiniMapcam")
    {
        Graphics.DrawMeshNow(miniMapMesh, transform.position, transform.rotation);
    }
    else
    {
        Graphics.DrawMeshNow(mainMesh, transform.position, transform.rotation);
    }
}
Run Code Online (Sandbox Code Playgroud)

奖励:我终于明白了真正的目的Camera.current!:D


WaitForEndOfFrame另一方面,在所有相机完成渲染后调用,不仅在Camera游戏对象上无处不在。

在渲染所有摄像机和 GUI之后,就在屏幕上显示帧之前等待,直到帧结束。


所以我会说不,你可以/不应该WaitForEndOfFrame使用OnRenderImage!