【问题标题】:How to EncodeToPng compressed Textures in Unity如何在 Unity 中 EncodeToPng 压缩纹理
【发布时间】:2018-12-21 06:59:50
【问题描述】:

我开发了一个保存纹理(屏幕截图)的应用程序,我需要压缩它们,但是我不能使用EncodeToPNG 方法来在屏幕上显示图像。

我的步骤:

  1. Texture2D tex = new Texture2D(recwidth, recheight, TextureFormat.RGB24, false); //RGB24- 因为下一步:

  2. tex.ReadPixels(rex, rdPXX, rdPXY); tex.Apply();

  3. tex.Compress(false);

稍后我需要在屏幕上显示它-

  1. var bytes = tex.EncodeToPNG();

但我不能,因为众所周知EncodeToPNG 不支持压缩纹理,那我该怎么办?在我的手机上占用大量空间

【问题讨论】:

  • 由于您正在开发应用程序,请记住 .Compress 仅在硬件支持 .DXT 时才有效,而大多数移动设备并非如此。
  • Sani- 我在 answers.unity 上看到了那个帖子,但这样做之后它仍然给我带来了问题。 Nathalie,谢谢,这是真的,但我在压缩到移动设备支持的 ASTC 时遇到了同样的问题

标签: c# unity3d texture2d


【解决方案1】:

在使用 EncodeToPNG 之前,您必须先解压缩纹理。您应该可以使用RenderTexture 执行此操作。将压缩后的Texture2D 复制到RenderTexture。将RenderTexture 分配给RenderTexture.active,然后使用ReadPixels 将像素从RenderTexture 复制到您希望解压缩格式的新Texture2D。现在,你可以在上面使用EncodeToPNG了。

执行此操作的辅助函数:

public static class ExtensionMethod
{
    public static Texture2D DeCompress(this Texture2D source)
    {
        RenderTexture renderTex = RenderTexture.GetTemporary(
                    source.width,
                    source.height,
                    0,
                    RenderTextureFormat.Default,
                    RenderTextureReadWrite.Linear);

        Graphics.Blit(source, renderTex);
        RenderTexture previous = RenderTexture.active;
        RenderTexture.active = renderTex;
        Texture2D readableText = new Texture2D(source.width, source.height);
        readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
        readableText.Apply();
        RenderTexture.active = previous;
        RenderTexture.ReleaseTemporary(renderTex);
        return readableText;
    }
}

用法:

创建压缩纹理:

Texture2D tex = new Texture2D(recwidth, recheight, TextureFormat.RGB24, false);
tex.ReadPixels(rex, rdPXX, rdPXY);
tex.Apply();
tex.Compress(false);

从压缩的纹理创建一个新的解压缩纹理:

Texture2D decopmpresseTex = tex.DeCompress();

编码为png

var bytes = decopmpresseTex.EncodeToPNG();

【讨论】:

  • 请注意:如果您在图像上使用不同的 pixelPerUnit,您应该在 sprite 创建阶段设置它。像这样:Sprite.Create(loadedTexture, new Rect(0f, 0f, loadedTexture.width, loadedTexture.height), new Vector2(.5f,.5f), 2048); //2048 是示例 pixelPerUnit 如果你不这样做,你只会看到一些像素并像我一样思考“出了什么问题”:)
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多