最近看到视频有演示汽车换漆,随后自己利用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