shader-单张纹理+光照

单张纹理+光照

效果

在这里插入图片描述

代码

Shader "Custom/t1" {   //9  
  //单张纹理+光照
   Properties{ //属性
        _Color ("Color", Color) = (1,1,1,1) //贴图整体颜色
        _Specular ("_Specular", Color) = (1,1,1,1)//高光颜色
        _Gloss("Gloss", Range(2,200)) = 20//高光范围
        _MainTex ("MainTex", 2D) = "white" {}//贴图
   }
   
   SubShader{ //子shader
        Pass{ //pass块
            Tags{  "LightMode" = "ForwardBase" } //渲染模式,前向渲染
            
            CGPROGRAM //cg代码开始
            //定义顶点函数
            #pragma vertex vert
            //定义片元函数 
            #pragma fragment frag
            //引用内置光照文件
            #include "Lighting.cginc"
            
            //cg中定义贴图颜色变量
            fixed4 _Color;
            //cg中定义贴图变量
            sampler2D _MainTex;
            //定义 贴图uv变量 _ST
            float4 _MainTex_ST;
            // 定义高光范围变量
            float _Gloss;
            //定义高光颜色变量
            fixed4 _Specular;
            
            struct a2v  //顶点着色器的输入  application to vertex shader
            {
                float4 vertex : POSITION; //接收顶点 方向
                float3 normal : NORMAL; //接收法线方向 
                float4 texcoord : TEXCOORD0; //接收第一组纹理坐标
            };
            
            struct v2f  //片元着色器输入
            {
                float4 pos : SV_POSITION;  //接收
                float3 worldNormal : TEXCOORD0; //纹理坐标 世界法线
                float3 worldPos : TEXCOORD1; //纹理坐标  世界顶点
                float2 uv : TEXCOORD2; // uv纹理
            };
            
            v2f vert (a2v a) { //顶点函数
                
                v2f f; //定义片元着色器的输入
                f.pos = UnityObjectToClipPos(a.vertex); //顶点转换到裁剪空间
                f.worldNormal  = mul( (float3x3) unity_ObjectToWorld, a.normal); //法线转到世界空间
                f.worldPos = mul(unity_ObjectToWorld, a.vertex).xyz; // 顶点转到世界空间
                f.uv =  TRANSFORM_TEX (a.texcoord, _MainTex); //纹理转到切线空间
                return f;//信息传递给片元函数
                
            };
            
            fixed4 frag ( v2f f) : SV_Target
            {
                fixed3 worldNormal = normalize  (  f.worldNormal );  //归一化 世界空间的法线方向
                fixed3 worldLightDir = normalize ( UnityWorldSpaceLightDir ( f.worldPos )  ); //获取世界空间下 该顶点的 光源方向
                fixed3 albedo = tex2D ( _MainTex,  f.uv).rgb * _Color.rgb; //对纹理进行采样, 传入第一个是需要被采样的纹理, 第二个是纹理坐标
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; //得到环境光
                fixed3 diffuse = _LightColor0.rgb * albedo *  max ( 0, dot(worldNormal, worldLightDir) );//计算漫反射
                fixed3 viewDir = normalize ( UnityWorldSpaceViewDir (f.worldPos) ); //计算视线方向  (相机-当前位置得到)
                fixed3 halfDir = normalize ( worldLightDir + viewDir ); //视线方向与光源方向求和,得到Blin计算前的半方向
                fixed3 specular = _LightColor0 * _Specular.rgb * pow (max (0, dot ( worldNormal, halfDir )) ,_Gloss); //计算高光
                return fixed4 (ambient + specular+ diffuse, 1); //返回最终的片元效果
            };
            //cg 模块结束 
            ENDCG
            
            
        }
        
        
        
   
   }

    FallBack "Diffuse"  //后备方案
   
}

原理:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值