Описание
Функция события, которую Unity вызывает после того, как камера визуализирует сцену.
Во встроенном конвейере рендеринга Unity вызывает OnPostRender
для MonoBehaviours, которые подключены к тому же GameObject, что и включенная Camera компонент, сразу после этого Camera визуализирует сцену. Используйте OnPostRender
для выполнения собственного кода в этой точке цикла рендеринга; например, если вы изменили визуальный эффект в MonoBehaviour.OnPreRender, вы можете изменить его здесь. OnPostRender
может быть сопрограммой.
Сведения об аналогичных функциях, не требующих, чтобы сценарий находился в том же игровом объекте, что и компонент камеры, см. в разделе Camera.onPostRender. Аналогичные функции конвейера рендеринга с поддержкой сценариев см. в разделе RenderPipelineManager.
Чтобы выполнить код после того, как Unity отобразит все камеры и графический интерфейс, используйте WaitForEndOfFrame или CommandBuffer.
using UnityEngine;
// Скрипт, который при подключении к камере делает результирующий
// цвета инвертированы. См. его эффект в режиме воспроизведения.
public class ExampleClass : MonoBehaviour
{
private Material mat;
// Будет вызываться из камеры после завершения обычного рендеринга.
public void OnPostRender()
{
if (!mat)
{
// Unity has a built-in shader that is useful for drawing
// simple colored things. In this case, we just want to use
// a blend mode that inverts destination colors.
var shader = Shader.Find("Hidden/Internal-Colored");
mat = new Material(shader);
mat.hideFlags = HideFlags.HideAndDontSave;
// Set blend mode to invert destination colors.
mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusDstColor);
mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
// Turn off backface culling, depth writes, depth test.
mat.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
mat.SetInt("_ZWrite", 0);
mat.SetInt("_ZTest", (int)UnityEngine.Rendering.CompareFunction.Always);
}
GL.PushMatrix();
GL.LoadOrtho();
// активируем первый проход шейдера (в данном случае мы знаем, что это единственный проход)
mat.SetPass(0);
// нарисовать четырехугольник на весь экран
GL.Begin(GL.QUADS);
GL.Vertex3(0, 0, 0);
GL.Vertex3(1, 0, 0);
GL.Vertex3(1, 1, 0);
GL.Vertex3(0, 1, 0);
GL.End();
GL.PopMatrix();
}
}
Смотрите так же: Camera.onPostRender, MonoBehaviour.OnPreRender, MonoBehaviour.OnPreCull, CommandBuffer, Extending the Built-in Render Pipeline using CommandBuffers, WaitForEndOfFrame.