回答“漠北黑夜”同学的问题——怎么实现切片shader?

“漠北黑夜”同学的问题原地址:
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
东方喵 著

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值