En este momento estás viendo ¿Cómo usar CommandBuffer.IssuePluginCustomBlit en Unity Engine?

 – Unity

¿Cómo usar CommandBuffer.IssuePluginCustomBlit en Unity Engine? – Unity

¿Cómo usar CommandBuffer.IssuePluginCustomBlit en Unity Engine?

– UnityAssets3Free

bienvenido , soy jorge y aqui os traigo
nueva pregunta curiosa

En Unity Engine, intento convertir un efecto de imagen (de asset tienda) del evento de la cámara OnRenderImage(RenderTexture source, RenderTexture destination) a un búfer de comando de cámara (UnityEngine.Rendering.CommandBuffer)(para controlar el orden de renderizado de toda la pila de efectos).

El método de renderizado del efecto de imagen de C# es bastante complicado y prefiero no modificarlo (rehacer el efecto desde cero podría ser más rápido).

Por lo tanto, la solución ideal sería llamar al método de representación de efectos de C# mediante un evento activado por el búfer de comando.

CommandBuffer.IssuePluginCustomBlit parece una solución, pero no puedo encontrar ningún ejemplo de cómo configurarlo.

Hace referencia a un método de devolución de llamada, una textura de renderizado de origen y una textura de renderizado de destino. Hay ejemplos de llamadas a métodos (especialmente en VRWorks plugin):

buffer.IssuePluginCustomBlit(PluginExtGetIssueEventCallback(), (UInt32)command, source, dest, commandParam, commandFlags);
[DllImport("GfxPluginVRWorks32", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    private static extern IntPtr PluginExtGetIssueEventCallback();

Sin embargo, no tengo idea de cómo el PluginExtGetIssueEventCallback está construido y cómo implementa las texturas de renderizado de origen y de destino.

Si alguien tiene un ejemplo para compartir cómo usar CommandBuffer.IssuePluginCustomBlit y se agradecería crear un método de devolución de llamada.

¡Gracias!

2 respuestas 2

Yo sugeriría CommandBuffer.Blit() en vez de. Puede usar fácilmente sombreadores personalizados con él.

Para crear una representación nativa plugin necesitaría escribir implementaciones separadas para cada API 3d (d3d11, d3d12, vulkan, metal) para cada plataforma que desee admitir (windows, android, ios). Todo esto en c++, excepto en apple donde prefieres usar el objetivo c. También tendría que escribir sus propios sombreadores para cada API 3D por separado.

Solo mira este pequeño ejemplo aquí:

https://github.com/Unity-Technologies/NativeRenderingPlugin

Tenga en cuenta que la representación nativa de Unity plugin La API está muy mal documentada. Estás prácticamente solo.

Luché por encontrarlo, pero esto parece funcionar:

En tu C#:

    ...
    cmd.IssuePluginCustomBlit(GetCustomBlitCallback(), 0, source, destination, 0, 0);
    ...


    private const string PluginName = "UnityRendering";

    [DllImport(PluginName, CallingConvention = CallingConvention.StdCall)]
    private static extern IntPtr GetCustomBlitCallback();

en tu nativo plugin:

#include "Unity/IUnityRenderingExtensions.h"

extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API CustomBlit(unsigned int command, UnityRenderingExtCustomBlitParams* iParams)

    ...


typedef void(UNITY_INTERFACE_API* UnityRenderingCustomBlit)(
    unsigned int command,
    UnityRenderingExtCustomBlitParams* iParams);

extern "C" UNITY_INTERFACE_EXPORT UnityRenderingCustomBlit UNITY_INTERFACE_API
GetCustomBlitCallback()

    return CustomBlit;

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,hasta la proxima

Deja una respuesta