unity Texture2D loadImage 精确取值

Unity Texture2D loadImage exact values

为什么使用 Unity,当我加载外部 1024x1024 RGBA32 .png(通过 PaintXP 或 Gimp 保存),中心有一个 (64,64,64) 像素的斑点时,Debug.Log 行在底部 return 值不正确? - 我能得到的最接近的是未压缩的 .png(来自 Gimp),其值类似于 (65,66,65),但对于标准图像,它们似乎返回为 (56,56,56)。

    Texture2D tex = null;
    byte[] fileData;
    if (File.Exists(mapPath + "/map.png"))
    {
        fileData = File.ReadAllBytes(mapPath + "/map.png");
        tex = new Texture2D(size, size, TextureFormat.RGBA32, false);
        tex.anisoLevel = 0;
        tex.Compress(false);
        tex.filterMode = FilterMode.Point;
        tex.LoadImage(fileData); // Auto-resize the texture dimensions
        Color32[] pixelsRaw = tex.GetPixels32(0);
        Color32[,] pixels = new Color32[size, size];
        for (int j = 0; j < size - 1; j++)
        {
            for (int i = 0; i < size - 1; i++)
            {
                pixels[i, j] = pixelsRaw[(j * tex.height) + i];
            }
        }
        Debug.Log(pixels[512, 512]);
    }

这一切都是为了从 .png 图像中读取基于图块的关卡。但是由于 returned 值如此不准确,我似乎无法找到一种方法来实现这一点。 (我已经用 Java.awt/LWJGL 完成了很多次并且在那里工作正常,为什么不使用 Unity?)

澄清一下,这张图片是从 Unity 项目外部加载的,因此无法通过编辑器手动设置 compression/format 设置。

有几个问题:压缩和伽玛校正。

1. 当您在 Texture2D 上调用 Compress 时,它将压缩您的纹理。 bool 参数只告诉它进行低质量或高质量压缩。所以只需删除行:tex.Compress(false);

2. PNG 有 gamma 信息。当您导出到 png 时,Gimp 有一个选项来保存 gamma 或不保存。因此,在 Gimp 中打开您的图像并在未选中 "Save Gamma" 选项的情况下将其导出。

或者,我可以通过使用 TweakPNG.

从 png 中删除 gAMAsRGB 属性来获得相同的结果