Является ли WaitForEndOfFrame таким же, как OnRenderImage?

#unity3d #shader

#unity3d #шейдер

Вопрос:

В Unity является WaitForEndOfFrame

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

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

идентично OnRenderImage ?

 void OnRenderImage() 
{
  BuildTexturesForExample();
}
  

(Само собой разумеется, что минимальный / бесполезный документ unity doco для двух вызовов не помогает.)

Если нет, то что делается «после», OnRenderImage пока WaitForEndOfFrame не будет вызвано?

Есть ли у кого-нибудь опыт сравнительного использования этих двух?

Безопасно ли заменять??????

Вы всегда можете безопасно заменить WaitForEndOfFrame шаблон на OnRenderImage ?1

В чем дело?


1(Конечно, gizmos / ongui не имеют значения.)

Комментарии:

1. Вы проверили этот порядок выполнения

2. Действительно, это ключевая ссылка, но этот документ действительно не помогает, @AliKanat ; он недостаточно конкретен. :/

Ответ №1:

Я думаю, я только что нашел фактический ответ в OnPostRender

OnPostRender вызывается после того, как камера отобразит все свои объекты. Если вы хотите что-то сделать после отображения всех камер и графического интерфейса, используйте WaitForEndOfFrame сопрограмму.

Итак (кроме того, что я думал, и порядок выполнения делает его похожим на внешний вид), все методы в блоке рендеринга (кроме OnGUI и OnDrawGizmos ) вызываются для каждой камеры, а также обратите внимание, что

OnPostRender: эта функция вызывается, только если скрипт подключен к камере и включен.

или

OnRenderImage: это сообщение отправляется всем скриптам, подключенным к камере.

Его назначение — постобработка (я понял, как они работают, только посмотрев примеры.), поэтому на самом деле он принимает 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);
}
  

Существует также, например, OnRenderObject который вызывается для всех игровых объектов ( 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 ! 😀


WaitForEndOfFrame с другой стороны, вызывается после того, как все камеры завершили рендеринг, и везде, не только на Camera игровом объекте.

Ожидает окончания кадра после рендеринга всех камер и графического интерфейса, непосредственно перед отображением кадра на экране.


Итак, я бы сказал, нет, вы можете / не должны заменять WaitForEndOfFrame с помощью OnRenderImage !

Комментарии:

1. Аааа! Вы полностью взломали его. Я понятия не имел, что это так! :O

2. Бум! действие @ bounty 🙂