WaitForEndOfFrame与OnRenderImage相同吗?

问题描述 投票:2回答:1

在Unity中,是WaitForEndOfFrame

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

IEnumerator _c() 
{
  yield return new WaitForEndOfFrame();
  BuildTexturesForExample();
}

OnRenderImage相同?

void OnRenderImage() 
{
  BuildTexturesForExample();
}

(不用说,这两个电话的最小/无用的统一doco没有帮助。)

如果不是在OnRenderImage之后做什么,直到WaitForEndOfFrame被召唤?

有没有人比较使用这两种经验?

Safe to replace??????

你能不能用WaitForEndOfFrame安全地替换OnRenderImage模式?1

这是怎么回事?


1(当然,小发明/ ongui是无关紧要的。)

unity3d shader
1个回答
4
投票

我想我刚刚在OnPostRender找到了实际答案

在相机渲染所有物体后调用OnPostRender。如果要在渲染完所有相机和GUI后执行某些操作,请使用WaitForEndOfFrame coroutine。

所以(除了我认为和ExecutionOrder使它看起来/听起来像)Render块中的所有方法(OnGUIOnDrawGizmos除外)都是基于每个相机调用的,并且还注意到

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

要么

OnRenderImage:此消息将发送到连接到摄像机的所有脚本。

它的目的是Post-Processing(我只了解他们如何看待这些例子。)因此它实际上需要2个参数!

OnRenderImage(RenderTexture src, RenderTexture dest)

所以你可以在收到输入(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);
}

还有例如在所有GameObjects(OnRenderObjects)上调用的MonoBehaviour不仅仅是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);
    }
}

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


另一方面,WaitForEndOfFrame在所有相机完成渲染之后被调用,并且不仅在Camera GameObject上到处都是。

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


所以我会说不,你可以/不应该用WaitForEndOfFrame取代OnRenderImage

© www.soinside.com 2019 - 2024. All rights reserved.