WaitForEndOfFrame - это то же самое, что OnRenderImage? - PullRequest
2 голосов
/ 01 апреля 2019

В Unity WaitForEndOfFrame

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

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

идентично OnRenderImage?

void OnRenderImage() 
{
  BuildTexturesForExample();
}

(само собой разумеется, минимальное / бесполезное единство doco на два вызова делаетне поможет.)

Если не то, что делается "после" OnRenderImage до тех пор, пока не будет вызван WaitForEndOfFrame

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

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

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

В чем дело?


1 (Конечно, штучки / онгуи не имеют значения.)

1 Ответ

4 голосов
/ 01 апреля 2019

Наверное, я только что нашел фактический ответ в OnPostRender

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

Таким образом (кроме того, что я думал, и ExecutionOrder делает его похожим на звук) все методы в блоке рендеринга (кроме 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, который вызывается all GameObjects (MonoBehaviour s), а не только 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.

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...