獲取模型的材質球貼圖中的像素點色值

獲取模型的材質球貼圖中的像素點色值,可以計算模型貼圖的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);
            }
        }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章