Unity-Screenshot-Screenshot-Aufnahme

Unity-Screenshot-Screenshot-Aufnahme

Mach ein Bildschirmfoto

  • Es wird dringend empfohlen, ScreenCapture.CaptureScreenshotIntoRenderTexture zu verwenden, um das Bild zu erfassen und nach der Skalierung abzurufen.
    	public class TestScreenShot : MonoBehaviour
        {
         
          
          
            public Button RecordBtn;
            public RawImage ScreenImage;
    
            RenderTexture m_renderTexture;
            RenderTexture m_targetTexture;
            Texture2D m_captureTexture;
    
            // Start is called before the first frame update
            void Start()
            {
         
          
          
                RecordBtn.onClick.AddListener(OnRecordClick);
            }
    
            private void OnRecordClick()
            {
         
          
          
                StartCoroutine(RecordCoroutine2());
            }
    
            //  截屏方式1: 使用 Texture2D.ReadPixels
            //  缺点是不能在GPU上缩放后再取回数据,只能取回数据后再缩放,分辨率大的情况下会卡
            IEnumerator RecordCoroutine()
            {
         
          
          
                //  必须等渲染完成,否则会报
                //  ReadPixels was called to read pixels from system frame buffer, while not inside drawing frame
                yield return new WaitForEndOfFrame();
    
                Texture2D texture = GetCaptureTexture(Screen.width, Screen.height);
                //  ReadPixels 从 GPU 取回图像数据,比较耗时
                //  不会进行任何缩放,截取屏幕矩形区域,然后把该矩形直接帖到纹理上,超出范围的被裁剪
                //  destX 和 destY 是像素坐标
                texture.ReadPixels(new Rect(0, 0, Screen.width / 2, Screen.height / 2), 0, 0, false);
                //  Apply 把图像数据上传 GPU,比较耗时,如果是保存到图片,则不需要调用,如果是给 RawImage 显示,则需要调用
                texture.Apply();
    
                SaveTexture(texture);
            }
    
            //  截屏方式2(最高效): 使用 ScreenCapture.CaptureScreenshotIntoRenderTexture 
            //  截取的是GPU图像,还未取回CPU,所以非常高效,配合 Graphics.Blit 进行缩放再取回数据,分辨率再大也不卡
            IEnumerator RecordCoroutine2()
            {
         
          
          
                //  必须等渲染完成,否则会报
                //  ReadPixels was called to read pixels from system frame buffer, while not inside drawing frame
                yield return new WaitForEndOfFrame();
    
    
                RenderTexture screen = GetRenderTexture(Screen.width, Screen.height);
                //  截取屏幕图像存在 GPU中,速度快,但要注意图像是上下颠倒的
                //  在 Editor 模式下,横屏场景中的相机录出来变形,原因可能是 Editor 模式下 Screen.orientation 永远是 Portrait
                ScreenCapture.CaptureScreenshotIntoRenderTexture(screen);
    
                RenderTexture target = GetTargetTexture(Screen.width/2, Screen.height/2);
    
                //  直接在 GPU 中缩放,速度快
                //  Blit 操作是进行纹理映射,target 上的纹理坐标uv的颜色 color=texture(sourceTexture,uv*scale+offset)
                //  由于截屏是上下颠倒的,通过设置 scale=(1,-1) offset=(0,1) 可以实现上下颠倒,摆正图像
                //  Blit 会设置 RenderTexture.active,所以调用完要设置 active=null,否则target可能会被其它代码写入其它东西
                Graphics.Blit(screen, target, new Vector2(1f, -1f), new Vector2(0f,1f));
                RenderTexture.active = null;
    
                SaveTexture(target);
            }
    
            //  截屏方式3(最简单): 使用 ScreenCapture.CaptureScreenshot 
            IEnumerator RecordCoroutine3()
            {
         
          
          
                //  必须等渲染完成,否则会报
                //  ReadPixels was called to read pixels from system frame buffer, while not inside drawing frame
                yield return new WaitForEndOfFrame();
    
                ScreenCapture.CaptureScreenshot

おすすめ

転載: blog.csdn.net/qmladm/article/details/131030654