【Unity】获取模型的材质球贴图中的像素点色值

获取模型的材质球贴图中的像素点色值,可以计算模型贴图的RGB、或某个色值的占比,也可以动态修改指定像素色值。

方式一:

获取可读的贴图,并遍历像素点:(通过Texture获取Texture2D操作的运算量比较大,耗时长,推荐方式二)

    void CalculateColor()
    {
        //获取网格
        MeshRenderer meshRenderer = transform.GetComponent<MeshRenderer>();
        if (meshRenderer == null)
            return;

        //默认第一个材质球
        Material material = meshRenderer.material;
        //如果有多个材质球,按顺序获取
        //Material material = meshRenderer.materials[0];

        //获取材质贴图
        Texture texture = material.mainTexture;
        //通过名字获取其他贴图
        //Texture texture = material.GetTexture("TextureName");

        //创建新渲染纹理
        RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
        //创建可读的Texture2D
        Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false);

        //记录原RenderTexture激活的渲染纹理
        RenderTexture oldActive = RenderTexture.active;

        //位块传送,拷贝texture纹理到renderTexture
        Graphics.Blit(texture, renderTexture);

        //修改RenderTexture的渲染纹理
        RenderTexture.active = renderTexture;

        //读取RenderTexture的渲染纹理像素信息,存储为纹理数据(Texture2D)
        texture2D.ReadPixels(new Rect(0, 0, texture.width, texture.height), 0, 0);

        //还原RenderTexture的原渲染纹理
        RenderTexture.active = oldActive;

        //释放临时渲染纹理
        RenderTexture.ReleaseTemporary(renderTexture);

        //应用前面对texture2D的操作
        texture2D.Apply();

        // ---------- 

        //texture2D宽高
        int pixelWidth = texture2D.width;
        int pixelHeight = texture2D.height;

        //获取Color32格式的像素颜色块 
        pixels32 = texture2D.GetPixels32();

        //遍历所有像素
        for (int y = 0; y < pixelHeight; y += downsample)
        {
            for (int x = 0; x < pixelWidth; x += downsample)
            {
                Color32 pixelColor32 = pixels32[y * pixelWidth + x];
                //在此获得每个像素色值信息
            }
        }
    }

方式二:

获取可读的贴图,遍历像素点,并修改色值:(简化方式一,但要将图片改为可读写状态)

    void CalculateColor02()
    {
        //获取网格
        MeshRenderer meshRenderer = transform.GetComponent<MeshRenderer>();
        if (meshRenderer == null)
            return;

        //默认第一个材质球
        Material material = meshRenderer.material;
        //如果有多个材质球,按顺序获取
        //Material material = meshRenderer.materials[0];

        //获取可读贴图
        Texture2D texture2D = material.mainTexture as Texture2D;

        // ---------- 

        //texture2D宽高
        int pixelWidth = texture2D.width;
        int pixelHeight = texture2D.height;

        //获取Color32格式的像素颜色块 
        pixels32 = texture2D.GetPixels32();

        //遍历所有像素
        for (int y = 0; y < pixelHeight; y += downsample)
        {
            for (int x = 0; x < pixelWidth; x += downsample)
            {
                //在此获得每个像素色值信息
                Color32 pixelColor32 = pixels32[y * pixelWidth + x];

                //修改色值
                texture2D.SetPixel(x, y, pixelColor32);
            }
        }
    }

发布了104 篇原创文章 · 获赞 74 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_39108767/article/details/101434359