UnityShader 学习笔记 1 漫反射

本文详细介绍了Unity中Shader的两种实现方式:逐像素和逐顶点。通过具体的代码示例,展示了如何使用CGPROGRAM进行光照计算,包括环境光、漫反射及半兰伯特效果的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 逐像素:


Shader "_MyShader/Diffuse/fragment"

{

    Properties

    {

        _Diffuse ("color1",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 vertex:POSITION;

                float3 normal:NORMAL;

            };



            struct v2f{

                float4 pos:SV_POSITION;

                float3 worldNormal:POSITION1;

            };



            v2f vert(a2v v){

                v2f o;

                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);

                //将法线转换到世界坐标中

                o.worldNormal=normalize(mul(v.normal,(float3x3)_World2Object));



                return o;

            }



            fixed4 frag (v2f i):SV_Target{

                //环境光的颜色

                fixed4 amb = UNITY_LIGHTMODEL_AMBIENT;



                //得到世界坐标中的光源颜色

                fixed3 worldLight=normalize(_WorldSpaceLightPos0);



                //漫反射

                fixed3 diffuseColor = _LightColor0 * _Diffuse * saturate(dot(worldLight,i.worldNormal));



                //半兰伯特

                //fixed3 diffuseColor = _LightColor0 * _Diffuse * (0.5*dot(worldLight,i.worldNormal)+0.5);



                return fixed4(diffuseColor,1)+amb;

            }



            ENDCG

        }



    }



    FallBack "Diffuse"

}




  • 逐顶点


Shader "_MyShader/Diffuse/vertex"

{

    Properties

    {

        _Diffuse ("color1",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 vertex:POSITION;

                float3 normal:NORMAL;

            };



            struct v2f{

                float4 pos:SV_POSITION;

                float3 color:COLOR;

            };



            v2f vert(a2v v){

                v2f o;

                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);



                //环境光的颜色

                fixed3 amb = UNITY_LIGHTMODEL_AMBIENT;

                //将法线转换到世界坐标中

                fixed3 worldNormal=normalize(mul(v.normal,(float3x3)_World2Object));

                //得到世界坐标中的光源颜色

                fixed3 worldLight=normalize(_WorldSpaceLightPos0);



                //漫反射

                fixed3 diffuseColor = _LightColor0 * _Diffuse * saturate(dot(worldLight,worldNormal));



                //半兰伯特

                //fixed3 diffuseColor = _LightColor0 * _Diffuse * (0.5*dot(worldLight,worldNormal)+0.5);



                o.color = diffuseColor+amb;

                return o;

            }



            fixed4 frag (v2f i):SV_Target{

                return fixed4(i.color,1);

            }



            ENDCG

        }



    }



    FallBack "Diffuse"

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值