unity实现模型颜色渐变

来源:互联网 发布:软件著作权代办加急 编辑:程序博客网 时间:2024/05/16 10:32

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


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

Shader "ChangeShader" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}}SubShader {Tags { "RenderType"="Opaque" }Cull OffPass{CGPROGRAM#pragma vertex vert#pragma fragment fragstruct 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"}

在近期的研究下,ChangeShader用于一个物体对象后只能是白色,不能调节颜色,于是纠结了,如果想再一个很华丽的shader里面想实现汽车换漆过度的效果显然这个ChangeShader是不可以满足的,那么我就分享一下自己琢磨的修改shader的方式,可能不是正确的,但是实验证明可以。

例如一个shader是这样的,里面有pass{。。。},那么把

Pass{CGPROGRAM#pragma vertex vert#pragma fragment fragstruct 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}
加到它的后面就可以了,具体原理不详,望高手指点。so cool!

demo下载:http://download.csdn.net/my,F1与F2键。


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 framevoid 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


0 0
原创粉丝点击