一日一Shader·法线【SS_22】

开始进击光学领域了,这将扩展出更多效果。

先从最基础的法线开始。

利用lambert原理:

Shader "MyShader/SS_22"  
{  
    //属性  
    Properties{          
        _MainTex("Texture", 2D) = ""{}  
        _Normal("Normal", 2D) = ""{}  
		_Emission("Emission",Range(0,1))=0.5
		_Wrap("Wrap",Range(0,1))=0.5
    }  
    //子着色器    
    SubShader  
    {      
	Tags{ "LightMode" = "UniversalForward" }
		CGINCLUDE  
		#include "Lighting.cginc"              
		sampler2D _MainTex;  
		sampler2D _Normal; 		            
		float _Emission;		
		float _Wrap;	
		struct appdata {
			float4 vertex : POSITION;
			float4 tangent : TANGENT;//切线方向
			float3 normal : NORMAL;//法线方向
			float4 uv : TEXCOORD0;
		};
		struct v2f  
		{  
		    float4 pos : SV_POSITION;  
		    float2 uv : TEXCOORD0;  
		    //tangent空间的光线方向  
		    float3 lightDir : TEXCOORD1;  
		}; 
  
		
		v2f vert(appdata v)  
		{  
		    v2f o;  
		    o.pos = UnityObjectToClipPos(v.vertex);  
		    //这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面注释的是具体计算;  
		    TANGENT_SPACE_ROTATION;  
			//float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; //副切线方向,*w是为了确定方向正确
			//float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );//TangentBinormalNormal确定一个面的rotation状态

		    //ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间  
		    o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));  
			o.uv=v.uv;
		    return o;  
		} 

		fixed4 frag(v2f i) : SV_Target  
		{  
			//环境光
		    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  
		    //获取法线  
		    float3 normal = UnpackNormal(tex2D(_Normal, i.uv));  
		    //光照方向  
		    float3 lightDir = normalize(i.lightDir);  
		   
			// fixed3 lambert = max(0,dot(normal, lightDir));//Lambert光照模型
		    fixed3 lambert =_Wrap*dot(normal, lightDir)+1-_Wrap; //半兰博通用化公式
			//加入光照,最终为颜色强度
		    fixed3 diffuse = lambert * _LightColor0.xyz + ambient;               
				
		    fixed4 color = tex2D(_MainTex, i.uv);  

		    return fixed4(diffuse* color.rgb+_Emission* color.rgb, 1.0);  
		}
		ENDCG  
		Pass  
		{ 
			CGPROGRAM	
			#pragma vertex vert  
			#pragma fragment frag 
			ENDCG	
		}
	}  
}  

返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值