“漠北黑夜”同学的问题原地址:
http://www.manew.com/thread-91341-1-1.html?_dsign=c8529254
我没有小恐龙模型可以切,T_T,就用Cube(方土豆儿)、Capsule(长土豆儿)来当土豆去削把~~
先讲下思路:
经过分析,我决定分两个pass来实现:
第一个pass是CullFront,首先,在第一个的vetrex函数中 ,用切片儿方向和顶点的法线,,计算出切面儿刀口的光照,然后,将切面儿位置和方向变换成Model空间,下一步好接着去用。
第二个pass是CullBack,和第一个pass的计算逻辑一致,but,使用普通的光照去计算。
挂个小脚本及时更新切片儿位置:
using UnityEngine;
using System.Collections;
public class ClipObj : MonoBehaviour {
public Transform clipObj;//切片儿的大砍刀
public Material mat;//自然是悲催的土豆
void Start () {
}
void Update () {
Vector3 cpos = clipObj.position;
Vector4 cnor = clipObj.up;
mat.SetVector ("cPos",new Vector4(cpos.x,cpos.y,cpos.z,1) );//第四个元素为1,而不是0,可确保平移
mat.SetVector ("cNormal",new Vector4(cnor.x,cnor.y,cnor.z,0) );
}
}
重点来了,被切片物体的shader:
Shader "Tut/Shader/ClipObj" {
Properties {
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
pass
{
Tags{"LightMode"="ForwardBase"}
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma target 3.0
struct v2f{
float4 pos:SV_POSITION;
float vc:TEXCOORD0;
float3 px:TEXCOORD1;
float3 cp:TEXCOORD2;
float3 cn:TEXCOORD3;
};
float4 cPos;//world Position
float4 cNormal;
v2f vert(appdata_full i)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,i.vertex);
float3 ld=ObjSpaceLightDir(i.vertex);
ld=normalize(ld);
//对于填补的洞口,使用剪切方向作为法线,计算光照
o.vc=max(0,dot(cNormal.xyz,ld));
o.px=i.vertex/i.vertex.w;
//float4 wPos=
o.cp=mul(_World2Object,cPos).xyz;
o.cn=mul(_World2Object,cNormal).xyz;
return o;
}
float4 frag(v2f i):COLOR
{
float3 dir=i.cp-i.px;
float c=dot(dir,i.cn);
clip(c);
return float4(i.vc,i.vc,i.vc,0);
}
ENDCG
}
pass
{
Tags{"LightMode"="ForwardBase"}
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma target 3.0
struct v2f{
float4 pos:SV_POSITION;
float vc:TEXCOORD0;
float3 px:TEXCOORD1;
float3 cp:TEXCOORD2;
float3 cn:TEXCOORD3;
};
float4 cPos;//world Position
float4 cNormal;
v2f vert(appdata_full i)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,i.vertex);
float3 ld=ObjSpaceLightDir(i.vertex);
ld=normalize(ld);
o.vc=max(0,dot(i.normal,ld));//正常计算光照
o.px=i.vertex/i.vertex.w;
o.cp=mul(_World2Object,cPos).xyz;
o.cn=mul(_World2Object,cNormal).xyz;
return o;
}
float4 frag(v2f i):COLOR
{
float3 dir=i.cp-i.px;
float c=dot(dir,i.cn);
clip(c);
return float4(i.vc,i.vc,i.vc,0);
}
ENDCG
}
}
FallBack "Diffuse"
}
土豆儿削好了!
完活,收工~!
欢迎收藏东方喵的博客 http://blog.csdn.net/qq_31794491
东方喵 著