【Unity】ShaderLab-2_2-基础光照模型-漫反射

14 篇文章 0 订阅
11 篇文章 0 订阅

漫反射 ShaderLab 实现

- 逐顶点漫反射 兰伯特模型

- 逐像素漫反射 兰伯特模型

- 逐像素漫反射 半兰伯特模型

/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐顶点漫反射 兰伯特模型
**/

Shader "Quaye/_DiffuseVertexLevel"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1,1,1,1)
    }
    SubShader
    {
        pass
        {
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM
            #pragma vertex      vert
            #pragma fragment    frag

            #include "Lighting.cginc"

            fixed4 _Diffuse;
            struct a2v      
            {
                float4 pos      : POSITION;
                float3 normal   : NORMAL;
            };
            struct v2f      
            {
                float4 pos      : SV_POSITION;
                fixed3 color    : COLOR;
            };


            // 兰伯特模型公式
            //  C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
            //
            //  C_light     :   _LightColor0        (Unity内置光源的颜色和强度信息)
            //  M_diffuse   :   _Diffuse            (漫反射颜色)
            //  n           :   来自v.normal变换    (v.normal 转到世界空间得到)
            //  l           :   _WorldSpaceLightPos0(Unity内置光源的光源方向)
            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);

                fixed3 worldNormal  = normalize(mul(unity_ObjectToWorld, v.normal));
                fixed3 worldLight   = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse      = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight));
                
                fixed3 ambient      = UNITY_LIGHTMODEL_AMBIENT.xyz;
                o.color = ambient + diffuse ;
                return o;
            }
            float4 frag(v2f i) :SV_Target
            {
                return fixed4 (i.color,1.0);
            }
            ENDCG
        }
    }
}





/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐像素漫反射 兰伯特模型
**/

Shader "Quaye/_DiffusePixelLevel"
{
    Properties
    {
        _Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Tags{"LightMode" = "ForwardBase"}

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            fixed3  _Diffuse;

            struct a2v
            {
                float4 pos      :   POSITION;
                float3 normal   :   NORMAL;
            };
            struct v2f
            {
                float4 pos          :   SV_POSITION;
                float3 worldNormal  : TEXCOORD0;
            };

            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);
                o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
                return o;
            }

            // 漫反射兰伯特模型 
            //  C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
            fixed4 frag(v2f i)  :   SV_Target
            {
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal,worldLightDir));
                return fixed4 (ambient + diffuse,1.0);
            }
            ENDCG
        }
    }
}





/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐像素漫反射 半兰伯特模型
**/

Shader "Quaye/_DiffusePixelLevel_half"
{
    Properties
    {
        _Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Tags{"LightMode" = "ForwardBase"}

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            fixed3  _Diffuse;

            struct a2v
            {
                float4 pos      :   POSITION;
                float3 normal   :   NORMAL;
            };
            struct v2f
            {
                float4 pos          :   SV_POSITION;
                float3 worldNormal  : TEXCOORD0;
            };

            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);
                o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
                return o;
            }

            // 半兰伯特模型   
            //  C_diffuse = (C_light*M_diffuse)*(0.5*dot(n,l)+0.5)
            fixed4 frag(v2f i)  :   SV_Target
            {
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(i.worldNormal,worldLightDir)+0.5);
                return fixed4 (ambient + diffuse,1.0);
            }
            ENDCG
        }
    }
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值