#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 🙂