Unity,将立方体映射保存为一个圆形图像

本文关键字:一个 图像 立方体 映射 保存 Unity | 更新日期: 2023-09-27 18:28:10

我有立方体映射。我需要将其保存为圆形图像,例如PNG。我在网上搜索了很多小时都失败了。我是怎么做的?这可能吗?

我有图片:joxi.ru/zANd66wSl6Kdkm

我需要保存在png:joxi.ru/12MW55wT40LYjr零件代码,它可以帮助你:

tex.SetPixels(cubemap.GetPixels(CubemapFace.PositiveZ)); 
bytes = tex.EncodeToPNG(); 
File.WriteAllBytes(Application.dataPath + "/" + cubemap.name +"_PositiveZ.png", bytes);

Unity,将立方体映射保存为一个圆形图像

您可以创建一个继承ScriptableWizard类的类,该类将从特定转换中呈现立方体映射。这是我的代码:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;
public class RenderCubemapWizard : ScriptableWizard
{
public Transform renderFromPosition;
public Cubemap cubemap;
void OnWizardUpdate()
{
    string helpString = "Select transform to render from and cubemap to render into";
    bool isValid = (renderFromPosition != null) && (cubemap != null);
}
void OnWizardCreate()
{
    // create temporary camera for rendering
    GameObject go = new GameObject("CubemapCamera");
    go.AddComponent<Camera>();
    // place it on the object
    go.transform.position = renderFromPosition.position;
    go.transform.rotation = Quaternion.identity;
    // render into cubemap      
    go.GetComponent<Camera>().RenderToCubemap(cubemap);
    // destroy temporary camera
    DestroyImmediate(go);
    ConvertToPng();
}
[MenuItem("GameObject/Render into Cubemap")]
static void RenderCubemap()
{
    ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
        "Render cubemap", "Render!");
}
void ConvertToPng()
{
    Debug.Log(Application.dataPath + "/" +cubemap.name +"_PositiveX.png");
    var tex = new Texture2D (cubemap.width, cubemap.height, TextureFormat.RGB24, false);
    // Read screen contents into the texture        
    tex.SetPixels(cubemap.GetPixels(CubemapFace.PositiveX));        
    // Encode texture into PNG
    var bytes = tex.EncodeToPNG();      
    File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveX.png", bytes);       
    tex.SetPixels(cubemap.GetPixels(CubemapFace.NegativeX));
    bytes = tex.EncodeToPNG();     
      File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_NegativeX.png", bytes);       
      tex.SetPixels(cubemap.GetPixels(CubemapFace.PositiveY));
      bytes = tex.EncodeToPNG();     
    File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveY.png", bytes);       
      tex.SetPixels(cubemap.GetPixels(CubemapFace.NegativeY));
      bytes = tex.EncodeToPNG();     
      File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_NegativeY.png", bytes);       
      tex.SetPixels(cubemap.GetPixels(CubemapFace.PositiveZ));
      bytes = tex.EncodeToPNG();     
      File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name +"_PositiveZ.png", bytes);       
      tex.SetPixels(cubemap.GetPixels(CubemapFace.NegativeZ));
      bytes = tex.EncodeToPNG();     
      File.WriteAllBytes(Application.dataPath + "/"  + cubemap.name   +"_NegativeZ.png", bytes);       
    DestroyImmediate(tex);
    }
}

这基本上是从您在向导中指定的给定位置创建一个新的立方体贴图(要使用向导,请转到顶部菜单中的GameObject,在列表底部,您将看到"渲染到立方体贴图")。然后,它将获取立方体映射的六个位置,并在ConvertToPng()函数中将其转换为来自的PNG文件。这对我有效,也应该对你有效,因为它本质上只需要一个变换位置。很抱歉,它被试了这么长时间来简化它,但这是我所能简化的。

以下是帮助我得出这个结论的链接:

如何将人脸转换为png

Unity的可脚本化向导,用于渲染立方体贴图

这是允许使用单个压缩立方体贴图纹理的正确方法。保存.png纹理后,只需将其设置为cube&所需的压缩设置。

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System.IO;
public class RenderCubemapUtil : ScriptableWizard
{
    public Transform renderFromPosition;
    public int size = 512;
    public string newCubmapPath;
    void OnWizardUpdate()
    {
        isValid = renderFromPosition != null && size >= 16 && !string.IsNullOrEmpty(newCubmapPath);
    }
    void OnWizardCreate()
    {
        if (!isValid) return;
        // create temporary camera for rendering
        var go = new GameObject("CubemapCamera");
        go.AddComponent<Camera>();
        try
        {
            // place it on the object
            go.transform.position = renderFromPosition.position;
            go.transform.rotation = Quaternion.identity;
            // create new texture
            var cubemap = new Cubemap(size, TextureFormat.RGB24, false);
            // render into cubemap
            go.GetComponent<Camera>().RenderToCubemap(cubemap);
            // convert cubemap to single horizontal texture
            var texture = new Texture2D(size * 6, size, cubemap.format, false);
            int texturePixelCount = (size * 6) * size;
            var texturePixels = new Color[texturePixelCount];
            var cubeFacePixels = cubemap.GetPixels(CubemapFace.PositiveX);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 0);
            cubeFacePixels = cubemap.GetPixels(CubemapFace.NegativeX);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 1);
            cubeFacePixels = cubemap.GetPixels(CubemapFace.PositiveY);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 3);
            cubeFacePixels = cubemap.GetPixels(CubemapFace.NegativeY);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 2);
            cubeFacePixels = cubemap.GetPixels(CubemapFace.PositiveZ);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 4);
            cubeFacePixels = cubemap.GetPixels(CubemapFace.NegativeZ);
            CopyTextureIntoCubemapRegion(cubeFacePixels, texturePixels, size * 5);
            texture.SetPixels(texturePixels, 0);
            // write texture as png to disk
            var textureData = texture.EncodeToPNG();
            File.WriteAllBytes(Path.Combine(Application.dataPath, $"{newCubmapPath}.png"), textureData);
            // save to disk
            AssetDatabase.SaveAssetIfDirty(cubemap);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
        finally
        {
            // destroy temporary camera
            DestroyImmediate(go);
        }
    }
    private void CopyTextureIntoCubemapRegion(Color[] srcPixels, Color[] dstPixels, int xOffsetDst)
    {
        int cubemapWidth = size * 6;
        for (int y = 0; y != size; ++y)
        {
            for (int x = 0; x != size; ++x)
            {
                int iSrc = x + (y * size);
                int iDst = (x + xOffsetDst) + (y * cubemapWidth);
                dstPixels[iDst] = srcPixels[iSrc];
            }
        }
    }
    [MenuItem("GameObject/Render into Cubemap")]
    static void RenderCubemap()
    {
        DisplayWizard<RenderCubemapUtil>("Render cubemap", "Render!");
    }
}
#endif