2016-01-22 6 views
0

Я принимаю скриншот с помощьюUnity3D Черный экран захвата экрана

Texture2D tex = new Texture2D(width,height); 
Rect textureRect = new Rect(0,0,width,height); 
tex.ReadPixels(textureRect,0,0); 
tex.Apply(); 

Он работает отлично. Но когда я применяю эффект изображения на камеру, такой как размытие или цветение, предусмотренные в Unity Standard Assets, снимок экрана является черным. Я не понимаю, почему. Может ли кто-нибудь помочь мне в этом?

ответ

1

Используйте Application.CaptureScreenshot, чтобы сделать снимок экрана.

Application.CaptureScreenshot("Screenshot.png"); 

Если вы хотите, чтобы отобразить его внутриигровой, я бы рекомендовал использовать RenderTexture, который я думаю, доступен бесплатно, так как Unity5 для.

+0

Я хочу сделать снимок экрана определенной области на экране, который я указываю методу ReadPixels. Application.CaptureScreenshot делает снимок экрана для всей камеры. Что касается RenderTexture, я не могу его использовать. Я использую Camera только для фонового изображения, я должен разместить по нему несколько элементов, которые размещаются с использованием UGUI, представленного в Unity 4.6. Эти элементы имеют холст режима рендеринга Screen Space Overlay. Я не хочу использовать отдельную камеру для этих элементов. – kashif789us

+0

Я сделал это с помощью RenderTexture. Я назначил RenderTexture для targetTexture камеры и показал эту RenderTexture как RawImage на моем холсте с перекрытием экрана. Затем снял снимок и его работу сейчас :) – kashif789us

0

Вам необходимо попробовать позвонить в OnPostRender() в любой состав.

Также вы можете запустить свой код захвата в: Camera.OnRenderImage(RenderTexture,RenderTexture)

Этого метод называется движком Unity3D после того, как весь рендеринг сделан, и мы имеем finall изображения на экране.

Для этого вам необходимо создать компонент и прикрепить его к камере.

http://docs.unity3d.com/ScriptReference/Camera.OnRenderImage.html

+0

Оба эти метода продолжают бесконечно звонить. – kashif789us

0
public IEnumerator SaveScreenshotRoutine(float width, float height, Action<Texture2D> result) 
{ 
    yield return new WaitForEndOfFrame(); 
    var tex = new Texture2D(width, height, TextureFormat.RGB24, false); 
    tex.ReadPixels(new Rect(0,0,width, height), 0, 0); 
    tex.Apply(); 
    result(tex); 
} 

дождаться кадра быть полностью сделано, так что даже рендеринг выполняется и любой активный/неактивный объект был добавлен/удален и использовать его как:

Texture2D texture = null; 
StartCoroutine(SaveScreenshotRoutine(result => texture =result)); 
+0

Я уже делаю это в со-рутине, поскольку это давало ошибку, когда я делал, как обычный метод. – kashif789us