1.首先创建一个三角形面片
建一个空的GameObject,添加上MeshFilter,MeshRenderer组件
创建如下脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class GenerateTriangle : MonoBehaviour
{
public Material mat;
// Start is called before the first frame update
void Start()
{
// 创建Mesh对象
Mesh mesh = new Mesh();
// 定义三角形的顶点
Vector3[] vertices = new Vector3[3]
{
new Vector3(0, 0, 0), // 顶点1
new Vector3(0, 1, 0), // 顶点2
new Vector3(1, 0, 0) // 顶点3
};
mesh.vertices = vertices;
// 定义三角形的三角形面(索引)
int[] triangles = new int[3]
{
// 顶点顺序为顺时针
0, 1, 2
};
mesh.triangles = triangles;
// 为每个顶点分配颜色
Color[] colors = new Color[3]
{
Color.red, // 顶点1颜色
Color.green, // 顶点2颜色
Color.blue // 顶点3颜色
};
mesh.colors = colors;
// 计算法线
mesh.RecalculateNormals();
// 将创建的Mesh赋给MeshFilter组件
MeshFilter meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = mesh;
// 为MeshRenderer添加材质,这里需要一个使用顶点颜色的Shader
// 例如,使用"Particles/Additive" Shader
//Material material = new Material(Shader.Find("Particles/Standard Unlit"));
GetComponent<MeshRenderer>().material = mat;
transform.position = Vector3.zero;
transform.localScale = new Vector3(5,5,5);
}
}
建一个材质 VertColorLerp
建一个shader VertColorLerp
Shader "Custom/VertColorLerp"
{
Properties
{
_Color ("MainColor", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
};
struct v2f
{
float4 pos : SV_POSITION;
float4 color : COLOR;
};
float4 _Color;
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.color;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
}
}
在Unity3D中,顶点颜色插值是在片元着色器中自动完成的。当你为一个Mesh的每个顶点指定了颜色后,这些颜色会在顶点之间进行插值,以计算每个片元的最终颜色。这个过程是由GPU在渲染时自动完成的
运行效果如下: