Снимок экрана 360 в Unity игнорирует слой пользовательского интерфейса - PullRequest
0 голосов
/ 05 ноября 2019

Проблема: я хочу сделать 360-градусный экранистический скриншот некоторых элементов интерфейса в UnityEditor. Инструмент, который я нашел, делает 360 снимков экрана очень хорошо, но оставляет Canvas Elements. Если я помещу куб в мою сцену, он появится на скриншоте. Если я помещу холст в мою сцену, он не будет виден на моем скриншоте.

Screenshotcontroller выглядит следующим образом:

    void Update()
    {
        if (Input.GetKeyDown("s"))
        {
            byte[] screenshot = I360Render.Capture( 2048, true, null, true );
            File.WriteAllBytes("D:/screenshot.jpg", screenshot);
        }
    }

Фактический скрипт, выполняющий скриншот, выглядит следующим образом:

public static class I360Render
{
    private static Material equirectangularConverter = null;
    private static int paddingX;

    public static byte[] Capture( int width = 1024, bool encodeAsJPEG = true, Camera renderCam = null, bool faceCameraDirection = true )
    {
        if( renderCam == null )
        {
            renderCam = Camera.main;
            if( renderCam == null )
            {
                Debug.LogError( "Error: no camera detected" );
                return null;
            }
        }

        RenderTexture camTarget = renderCam.targetTexture;

        if( equirectangularConverter == null )
        {
            equirectangularConverter = new Material( Shader.Find( "Hidden/I360CubemapToEquirectangular" ) );
            paddingX = Shader.PropertyToID( "_PaddingX" );
        }

        int cubemapSize = Mathf.Min( Mathf.NextPowerOfTwo( width ), 8192 );
        RenderTexture activeRT = RenderTexture.active;
        RenderTexture cubemap = null, equirectangularTexture = null;
        Texture2D output = null;
        try
        {
            cubemap = RenderTexture.GetTemporary( cubemapSize, cubemapSize, 0 );
            cubemap.dimension = UnityEngine.Rendering.TextureDimension.Cube;

            equirectangularTexture = RenderTexture.GetTemporary( cubemapSize, cubemapSize / 2, 0 );
            equirectangularTexture.dimension = UnityEngine.Rendering.TextureDimension.Tex2D;

            if( !renderCam.RenderToCubemap( cubemap, 63 ) )
            {
                Debug.LogError( "Rendering to cubemap is not supported on device/platform!" );
                return null;
            }

            equirectangularConverter.SetFloat( paddingX, faceCameraDirection ? ( renderCam.transform.eulerAngles.y / 360f ) : 0f );
            Graphics.Blit( cubemap, equirectangularTexture, equirectangularConverter );

            RenderTexture.active = equirectangularTexture;
            output = new Texture2D( equirectangularTexture.width, equirectangularTexture.height, TextureFormat.RGB24, false );
            output.ReadPixels( new Rect( 0, 0, equirectangularTexture.width, equirectangularTexture.height ), 0, 0 );

            return encodeAsJPEG ? InsertXMPIntoTexture2D_JPEG( output ) : InsertXMPIntoTexture2D_PNG( output );
        }
        catch( Exception e )
        {
            Debug.LogException( e );
            return null;
        }
        finally
        {
            renderCam.targetTexture = camTarget;
            RenderTexture.active = activeRT;

            if( cubemap != null )
                RenderTexture.ReleaseTemporary( cubemap );

            if( equirectangularTexture != null )
                RenderTexture.ReleaseTemporary( equirectangularTexture );

            if( output != null )
                UnityEngine.Object.DestroyImmediate( output );
        }
    }

Что не так? Почему это решение игнорирует элементы пользовательского интерфейса?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

нашел ответ. На самом деле это ошибка в Unity 360 Capture SDK, которая существует уже более года и связана с функцией RenderToCubemap. Существует хакерский обходной путь здесь в ответах № 4 и № 10. Но это не будет работать для текстовых элементов, которые используют TextMesh Pro и вызывает снижение производительности.

0 голосов
/ 05 ноября 2019

Размер экрана - Наложение элементов пользовательского интерфейса обычно не отображается на камере. Они отображаются прямо на экране. Поскольку ваш снимок экрана основан на текстуре камеры, вы не будете захватывать Canvas или другие элементы пользовательского интерфейса, которые отображаются непосредственно на экране.

Вы можете изменить холст для рендеринга в Screen Space - Camera. Возможно, вам придется немного изменить свой интерфейс.

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