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;
    }
}

生成Texture2D纹理图片的更多相关文章

  1. cocos2d-x 详解之 CCTexture2D(纹理图片)和 CCTextureCache(纹理缓存)

    精灵和动画都涉及到纹理图片的使用,所以在研究精灵与动画之前,我们先来了解一下纹理图片类CCTexture2D和纹理缓存CCTextureCache的原理: 当一张图片被加载到内存后,它是以纹理的形式存 ...

  2. 【代码笔记】iOS-通过颜色来生成一个纯色图片

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  3. 用ticons指令结合ImageMagickDisplay工具批量生成Android适应图片

    用ticons指令结合ImageMagickDisplay工具批量生成Android适应图片 ticons的用法可以百度 这里记录下具体的编译方法 在安装了ticons和ImageMagickDisp ...

  4. PHP 简易读取文件目录下的文件,生成css spirte图片

    因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的 ...

  5. C#上传图片和生成缩略图以及图片预览

    因工作需要,上传图片要增加MIME类型验证和生成较小尺寸的图片用于浏览.根据网上代码加以修改做出如下效果图: 前台代码如下: <html xmlns="http://www.w3.or ...

  6. iOS 通过颜色来生成一个纯色图片

    //通过颜色来生成一个纯色图片- (UIImage *)buttonImageFromColor:(UIColor *)color{        CGRect rect = CGRectMake(0 ...

  7. PHP使用JPG生成GIF动画图片,基于php_imagick_st-Q8.dll

    PHP使用php_imagick_st-Q8.dll类库,把JPG图片连接生成GIF动画图片,需要事先下载好php_imagick_st-Q8.dll,文件,并配置php.ini文件,启用php_im ...

  8. 使用poi和jfreechart生成excel图表图片

    最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...

  9. 批量生成反色图片,用PHOTOSHOP批处理功能。

    http://zhidao.baidu.com/link?url=Iz46PDPnEITummTEwo2GtUrK6AeAjlidJ7HtCPJ6NYZJbbllRwNg2iBAcNwF2TYjccP ...

随机推荐

  1. excel中如何取消自动超链接?

    最近做的表格有点多,年终述职也到了.总有一些地方生疏了,幸好还有点小印象.记录下来,以后可以回来看看. 方法一 适合单个链接的取消 1 输入网址后,按回车键确认,快捷键ctrl+z,即可取消,这种不好 ...

  2. [POI2007]驾驶考试egz

    题目 BZOJ 神仙题,可比那些氵紫题有意思多了 做法 \(i\)能作为起始点,当\(i\)能到达\(1\)~\(i-1\)和\(i+1\)~\(n\) 这样处理显然会麻烦,因为要从每个点都特判一次 ...

  3. Redux API之bindActionCreators

    bindActionCreators(actionCreators,dispatch) 把 action creators 转成拥有同名 keys 的对象,但使用 dispatch 把每个 actio ...

  4. Centos7 关闭Ipv6

  5. JAVA基础补漏--基础数据类型与引用数据类型

    ==在不同数据类型中意义不同. 在基础数据类型中,表示的是数值的比较. 在引用数据类型中,表示的是内存地址值的比较. 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit), ...

  6. Linux挂载第二块硬盘操作方法

    远程SSH登录上Centos服务器后,进行如下操作 提醒:挂载操作会清空数据,请确认挂载盘无数据或者未使用 第一步:列出所有已挂载磁盘 命令: disk -h [root@gluster_node1 ...

  7. Linux FTP 上传一键脚本

    下面来介绍一下这个 FTP 上传一键脚本 ftp_upload.sh. 用途:用于在Linux系统下搭建FTP客户端向FTP服务器端上传文件: 总结一下 ftp_upload.sh 特点:1.支持文件 ...

  8. Nuxt / Vue.js in TypeScript: Object literal may only specify known properties, but 'components' does not exist in type 'VueClass'

    项目背景, Nuxt(vue), TypeScript 生成完项目框架, 添加测试demo页面. 在生成的模板代码中添加layout配置如下: <script lang="ts&quo ...

  9. R语言笔记003——set.seed()函数

    set.seed()函数 set.seed()设定生成随机数的种子,让样本可重复. > x<-rnorm() # 生成4个随机数 > x [] 0.6599492 0.5881863 ...

  10. java 实现HTTP连接(HTTPClient)

    在实习中,使用到了http连接,一直理解的很模糊,特地写个分析整理篇.分析不到位的地方请多多指教. Http 目前通用版本为 http 1.1 . Http连接大致分为2种常用的请求——GET,POS ...