2016-01-22 78 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标准资产中提供的模糊或绽放)时,截取的截图为黑色。我不懂为什么。有人可以帮助我吗?

回答

1

使用Application.CaptureScreenshot拍摄截图。

Application.CaptureScreenshot("Screenshot.png"); 

如果你想游戏中显示的话,我会建议使用RenderTexture,我认为这是可以自Unity5免费。

+0

我想在指定给ReadPixels方法的屏幕上截取特定区域的屏幕截图。 Application.CaptureScreenshot获取整个摄像机的屏幕截图。关于RenderTexture,我无法使用它。我只使用Camera作为背景图片,我必须在它上面放置几个项目,这些项目是使用Unity 4.6中引入的UGUI放置的。这些项目具有渲染模式的屏幕空间覆盖。我不想为这些项目使用单独的相机。 – kashif789us

+0

我用RenderTexture做了。我将一个RenderTexture分配给相机的目标纹理,并在我的Screen Overlay Canvas上将此RenderTexture显示为RawImage。然后采取screenhot和它的工作:) – 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