生成Texture2D紋理圖片


 

 

using UnityEngine;
using System.Collections;

public class ProceduralTexture : MonoBehaviour
{

    public int widthHeight = 512;

    /// <summary>  
    /// 生成的圖片  
    /// </summary>  
    public Texture2D generatedTexture;

    /// <summary>  
    /// 當前的材質  
    /// </summary>  
    private Material currentMaterial;

    /// <summary>  
    /// 中心坐標  
    /// </summary>  
    private Vector2 centerPosition;

    public int i = 0;
    private int _i = 999;
    // Use this for initialization  
    void Update()
    {
        if (i == _i) return;

        if (!currentMaterial)
        {
            //共享當前物體的材質  
            currentMaterial = transform.GetComponent<Renderer>().sharedMaterial;
            if (!currentMaterial)
            {
                Debug.LogWarning("Cannot find a material on:" + transform.name);
            }
        }

        if (currentMaterial)
        {
            centerPosition = new Vector2(0.5f, 0.5f);
            generatedTexture = GenerateParabola();

            //設置當前材質的貼圖為我們生成的貼圖  
            currentMaterial.SetTexture("_MainTex", generatedTexture);
        }
        _i = i;
    }

    /// <summary>  
    /// 生成貼圖  
    /// </summary>  
    /// <returns></returns>  
    private Texture2D GenerateParabola()
    {
        //新建一張貼圖  
        Texture2D proceduralTexture = new Texture2D(widthHeight, widthHeight);

        //中心像素坐標  
        Vector2 centerPixelPosition = centerPosition * widthHeight;

        //遍歷像素點設置  
        for (int x = 0; x < widthHeight; x++)
        {
            for (int y = 0; y < widthHeight; y++)
            {
                if (i == 0) {
                    #region 顏色控制在黑白,線性變化函數是y=|1-x|,1>=x>=0  
                    Vector2 currentposition = new Vector2(x, y);
                    float pixeldistance = Vector2.Distance(currentposition, centerPixelPosition) / (widthHeight * 0.5f);

                    pixeldistance = Mathf.Abs(1 - Mathf.Clamp(pixeldistance, 0f, 1f));

                    Color pixelcolor = new Color(pixeldistance, pixeldistance, pixeldistance, 1.0f);
                    proceduralTexture.SetPixel(x, y, pixelcolor);
                    #endregion
                } else if (i == 1) {
                    #region 顏色控制在黑白隨sin周期變化,變化是(2*π)/n,下面的n是30  
                    Vector2 currentPosition = new Vector2(x, y);
                    float pixelDistance = Vector2.Distance(currentPosition, centerPixelPosition) / (widthHeight * 0.5f);
                    pixelDistance = Mathf.Abs(1 - Mathf.Clamp(pixelDistance, 0f, 1f));
                    pixelDistance = (Mathf.Sin(pixelDistance * 30) * pixelDistance);
                    Color pixelColor = new Color(pixelDistance, pixelDistance, pixelDistance, 1.0f);
                    proceduralTexture.SetPixel(x, y, pixelColor);
                    #endregion
                } else if (i == 2) {
                    #region 顏色根據方向向量偏移角度控制  
                    Vector2 currentPosition = new Vector2(x, y);
                    Vector2 pixelDirection = centerPixelPosition - currentPosition;
                    pixelDirection.Normalize();
                    float rightDirection = Vector2.Angle(pixelDirection, Vector3.right) / 360;
                    float leftDirection = Vector2.Angle(pixelDirection, Vector3.left) / 360;
                    float upDirection = Vector2.Angle(pixelDirection, Vector3.up) / 360;
                    Color pixelColor = new Color(rightDirection, leftDirection, upDirection, 1.0f);
                    proceduralTexture.SetPixel(x, y, pixelColor);
                    #endregion
                }else if(i == 3) {
                    #region 顏色根據方向向量和方向軸的數量積  
                    Vector2 currentPosition = new Vector2(x, y);
                    Vector2 pixelDirection = centerPixelPosition - currentPosition;
                    pixelDirection.Normalize();
                    float rightDirection = Vector2.Dot(pixelDirection, Vector3.right);
                    float leftDirection = Vector2.Dot(pixelDirection, Vector3.left);
                    float upDirection = Vector2.Dot(pixelDirection, Vector3.up);
                    Color pixelColor = new Color(rightDirection, leftDirection, upDirection, 1.0f);
                    proceduralTexture.SetPixel(x, y, pixelColor);
                    #endregion
                }
            }
        }

        proceduralTexture.Apply();

        return proceduralTexture;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM