Проблема: я хочу сделать 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 );
}
}
Что не так? Почему это решение игнорирует элементы пользовательского интерфейса?