Unity的坑:Texture2D.alphaIsTransparency

    static public void ImportTex(string textureAsset)
    {
        if (string.IsNullOrEmpty(textureAsset))
        {
            return;
        }

        AssetDatabase.Refresh(ImportAssetOptions.Default);

        TextureImporter ti = (TextureImporter)TextureImporter.GetAtPath(textureAsset);
        if (ti != null)
        {
            ti.isReadable = false;
            ti.mipmapEnabled = false;
            ti.alphaIsTransparency = true;
            ti.filterMode = FilterMode.Bilinear;
            ti.wrapMode = TextureWrapMode.Clamp;
            ti.npotScale = TextureImporterNPOTScale.None;
            ti.textureCompression = TextureImporterCompression.Uncompressed;
            ti.SaveAndReimport();
        }
        else
        {
            Log.Error("Import Fail:{0}", textureAsset);
        }
    }

以上代码, 设置了alphaIsTransparency属性;或者在Unity的Inspector中,对纹理勾选这个选项,那么Unity会做什么事情呢?

如果有一张PNG图片, 95%的地方是全透明的,而在全透明的地方,RGB值是有意义的;

如果设置了alphaIsTransparency属性,则全透明的地方,Unity会将RGB值全部丢失!!!

 

所以:

如果要使用此纹理的4个通道做数据存储时(比如地型的4通道混合)

千万不能勾选alphaIsTransparency属性

除非此PNG图片仅仅用于UI显示;

这点在官方文档上没有说明!

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误是因为你正在尝试从一个不可读取的纹理中获取像素数据。通常情况下,Unity中的纹理是默认不可读取的,除非你明确地将其设置为可读取。 要解决这个问题,你可以将纹理的读写选项设置为可读取。以下是一种修改代码的方式: ```csharp using UnityEngine; public class ExtractGreenPixels : MonoBehaviour { public Renderer quadRenderer; // 这里假设你已经将Quad的Renderer组件拖拽到了该变量上 public string imagePath = "temp.png"; private void Start() { // 获取Quad的纹理 Texture2D quadTexture = (Texture2D)quadRenderer.material.mainTexture; // 设置纹理为可读取 quadTexture.wrapMode = TextureWrapMode.Clamp; quadTexture.filterMode = FilterMode.Point; quadTexture.Apply(); // 提取绿色像素 Color[] pixels = quadTexture.GetPixels(); for (int i = 0; i < pixels.Length; i++) { if (pixels[i].g > 0.5f && pixels[i].r < 0.5f && pixels[i].b < 0.5f) { // 绿色像素 Debug.Log("绿色像素坐标:(" + (i % quadTexture.width) + ", " + (i / quadTexture.width) + ")"); } } } } ``` 在这个示例中,我们首先获取了Quad的纹理。然后,我们将纹理的wrapMode设置为Clamp,filterMode设置为Point,并且调用Apply方法应用这些设置。这些设置将确保纹理可读取。 之后,我们可以像之前一样使用GetPixels函数来获取纹理的像素数据,并提取绿色像素。 请确保Quad的Renderer组件已经拖拽到了脚本的相应变量上,并且确保temp.png文件存在并正确设置了图片路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值