在Unity中拍摄图像的快照

时间:2016-11-16 08:50:58

标签: unity3d camera thumbnails render-to-texture

我正在尝试拍摄我在Unity应用程序中使用的材料的快照。我只是添加一个定向灯和一个摄像头,并以透视模式。然后我将结果渲染为纹理并将其保存为.png文件。结果很好,但在图像中间有一个奇怪的小发明像图。这是:enter image description here

相机和灯光远离物体。此外,我禁用了光线,看它是否是由定向光引起的。但没有解决。有谁知道这个椭圆形的原因是什么?提前谢谢。

编辑。这是代码

    public static Texture2D CreateThumbnailFromMaterial(Material _material, string _name, string _path)
    {
        GameObject sphereObj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphereObj.name = _name;
        sphereObj.GetComponent<Renderer>().material = _material;

        Texture2D thumbnailTexture = CreateThumbnailFromModel(sphereObj, _path);
        sphereObj.GetComponent<Renderer>().material = null;
        Object.DestroyImmediate(sphereObj.gameObject);
        return thumbnailTexture;
    }

    public static Texture2D CreateThumbnailFromModel(GameObject _gameObject, string _path)
    {
        Texture2D thumbnailTexture = new Texture2D(textureSize, textureSize);
        thumbnailTexture.name = _gameObject.name.Simplify();
        GameObject cameraObject = Object.Instantiate(Resources.Load("SceneComponent/SnapshotCamera") as GameObject);

        Camera snapshotCamera = cameraObject.GetComponent<Camera>();
        if (snapshotCamera)
        {
            GameObject sceneObject = GameObject.Instantiate(_gameObject) as GameObject;                
            sceneObject.transform.Reset();
            sceneObject.transform.position = new Vector3(1000, 0, -1000);
            sceneObject.hideFlags = HideFlags.HideAndDontSave;

            // Create render texture
            snapshotCamera.targetTexture = RenderTexture.GetTemporary(textureSize, textureSize, 24);
            RenderTexture.active = snapshotCamera.targetTexture;

            // Set layer 
            foreach (Transform child in sceneObject.GetComponentsInChildren<Transform>(true))
            {
                child.gameObject.layer = LayerMask.NameToLayer("ObjectSnapshot");
            }

            // Calculate bounding box 
            Bounds bounds = sceneObject.GetWorldSpaceAABB();
            float maxBoundValue = 0f;
            if (bounds.IsValid())
            {
                maxBoundValue = Mathf.Max(bounds.size.x, bounds.size.y, bounds.size.z);
            }
            double fov = Mathf.Deg2Rad * snapshotCamera.GetComponent<Camera>().fieldOfView;
            float distanceToCenter = (maxBoundValue) / (float)System.Math.Tan(fov);

            cameraObject.transform.LookAt(bounds.center);
            cameraObject.transform.position = bounds.center - (snapshotCamera.transform.forward * distanceToCenter);
            cameraObject.transform.SetParent(sceneObject.transform);
            snapshotCamera.Render();

            thumbnailTexture.ReadPixels(new Rect(0, 0, textureSize, textureSize), 0, 0);
            thumbnailTexture.Apply();

            sceneObject.transform.Reset();
            snapshotCamera.transform.SetParent(null);
            RenderTexture.active = null;
            GameObject.DestroyImmediate(sceneObject);
            GameObject.DestroyImmediate(cameraObject);

            // Save as .png   
            IO.IOManager.Instance.SaveAsPNG(_path + thumbnailTexture.name, thumbnailTexture);
        }
        return thumbnailTexture;
    }

这是我的相机属性enter image description here

0 个答案:

没有答案