在Unity中,是WaitForEndOfFrame
void Update()
{
StartCoroutine(_c());
}
IEnumerator _c()
{
yield return new WaitForEndOfFrame();
BuildTexturesForExample();
}
与OnRenderImage
相同?
void OnRenderImage()
{
BuildTexturesForExample();
}
(不用说,这两个电话的最小/无用的统一doco没有帮助。)
如果不是在OnRenderImage
之后做什么,直到WaitForEndOfFrame
被召唤?
有没有人比较使用这两种经验?
你能不能用WaitForEndOfFrame
安全地替换OnRenderImage
模式?1
这是怎么回事?
1(当然,小发明/ ongui是无关紧要的。)
我想我刚刚在OnPostRender
找到了实际答案
在相机渲染所有物体后调用
OnPostRender
。如果要在渲染完所有相机和GUI后执行某些操作,请使用WaitForEndOfFrame
coroutine。
所以(除了我认为和ExecutionOrder使它看起来/听起来像)Render块中的所有方法(OnGUI
和OnDrawGizmos
除外)都是基于每个相机调用的,并且还注意到
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(OnRenderObject
s)上调用的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
!