首页 > 其他 > 详细

unity实现模型颜色渐变

时间:2014-02-21 03:39:10      阅读:1089      评论:0      收藏:0      [点我收藏+]

最近看到视频有演示汽车换漆,随后自己利用shader与获取模型顶点颜色,实现了换漆效果,本人能力有限,希望多多提出不足,多多向大神学习。


1、shader是自己找的一个,本人不懂shader的编写,但是这个确实是可以用的。

Shader "ChangeShader" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		Cull Off
		
		Pass{
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag

				struct data {
					float4 vertex : POSITION;
					fixed4 color: COLOR;
				};

				data vert (data v) {
					v.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
					return v;
				}

				fixed4 frag(data f) : COLOR {
					return f.color;
				}
			ENDCG
		}
	} 
	FallBack "Diffuse"
}

2、代码编写,由于没有汽车模型,就利用Plane做了一个demo,如果有兴趣的可以试试汽车模型的换漆效果。

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
    public enum AXIS
    {
        axis_X,
        axis_Y,
        axis_Z
    }

    public AXIS stateAxis = AXIS.axis_X;
	// Use this for initialization
    private Mesh mMesh = null;
    private Vector3[] vertices = null;
    private Color[] colorList = null;
    public float num = 0;
    private float startValue = 0;
    private bool isChangeColor = false;
    private Color _color = Color.white;
    private Color startColor = Color.white;

    public GameObject targetObj = null;
	void Start () {
        Init();
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.F1) && !isChangeColor)
        {
            _color = Color.yellow;
            isChangeColor = true;
        }
        if (Input.GetKeyDown(KeyCode.F2) && !isChangeColor)
        {
            _color = Color.red;
            isChangeColor = true;
        }

        if (isChangeColor)
        {
            SetChangeModeColor(_color);
        }
	}

    void Init()
    {
        if (null == targetObj) targetObj = gameObject;
        mMesh = targetObj.GetComponent<MeshFilter>().mesh;
        if (null == mMesh)
        {
            Debug.LogError(targetObj.name + "_MeshFilter is null");
            return;
        }
        vertices = mMesh.vertices;
        colorList = new Color[vertices.Length];
        //SetChangeModeColor(Color.red);
        num = -gameObject.renderer.bounds.extents.z;
        startValue = num;
    }

    void SetChangeModeColor(Color targetColor)
    {
        if (startColor == targetColor)
        {
            isChangeColor = false;
            return;
        }
        if (num > -startValue)
        {
            isChangeColor = false;
            startColor = targetColor;
            num = startValue;
        }
        for (int index = 0; index < vertices.Length; index++)
        {
            if (stateAxis == AXIS.axis_X)
                colorList[index] = Color.Lerp(startColor, targetColor, vertices[index].x + num);
            if (stateAxis == AXIS.axis_Y)
                colorList[index] = Color.Lerp(startColor, targetColor, vertices[index].y + num);
            if (stateAxis == AXIS.axis_Z)
                colorList[index] = Color.Lerp(startColor, targetColor, vertices[index].z + num);
        }
        num += (Time.deltaTime*1);
        mMesh.colors = colorList;
    }
}


希望学习到更多。

demo地址下载

http://download.csdn.net/detail/fanglrui/6941347


unity实现模型颜色渐变

原文:http://blog.csdn.net/fanglrui/article/details/19553709

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!