目前是使用透明剪切的方式实现的,暂时没有办法把透明和不透明的Shader到一起,就分成两个Shader来做。首先是不透明的:
其次是透明的:
为了能够看清楚切片的平面,写了一个脚本,用于显示这个切片,内容如下:
using UnityEngine;
public class SliceShow : MonoBehaviour
{
[SerializeField]
float size = 1;
[SerializeField]
Color color = Color.red;
void OnDrawGizmos()
{
MeshRenderer render = GetComponent<MeshRenderer>();
if (!render) return;
Material mat = render.material;
if (!mat) return;
if (!mat.HasVector("_SlicePoint")) return;
if (!mat.HasVector("_SliceDirection")) return;
Vector3 slicePoint = mat.GetVector("_SlicePoint");
Vector3 sliceDirection = mat.GetVector("_SliceDirection");
Gizmos.color = color;
Gizmos.matrix = transform.localToWorldMatrix;
Gizmos.DrawSphere(slicePoint, 0.01f);
Vector3 p1;
Vector3 p2;
Vector3 p3;
Vector3 p4;
if (Mathf.Approximately(sliceDirection.x,0) && Mathf.Approximately(sliceDirection.y, 0))
{
p1 = slicePoint + new Vector3(1,1) * size;
p2 = slicePoint + new Vector3(1, -1) * size;
p3 = slicePoint + new Vector3(-1, 1) * size;
p4 = slicePoint + new Vector3(-1, -1) * size;
}
else
{
Vector3 v0 = Vector3.Cross(Vector3.forward ,sliceDirection).normalized * size;
Vector3 v1 = -v0;
Vector3 v2 = Vector3.Cross(v1, sliceDirection).normalized * size;
Vector3 v3 = -v2;
p1 = slicePoint + (v0 + v2);
p2 = slicePoint + (v1 + v2);
p3 = slicePoint + (v0 + v3);
p4 = slicePoint + (v1 + v3);
}
Gizmos.DrawLine(p1, p2);
Gizmos.DrawLine(p3, p4);
Gizmos.DrawLine(p1, p3);
Gizmos.DrawLine(p2, p4);
Gizmos.DrawLine(p1, p4);
Gizmos.DrawLine(p2, p3);
}
}
好了,就到这里:)