最近看到视频有演示汽车换漆,随后自己利用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" }
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
原文:http://blog.csdn.net/fanglrui/article/details/19553709