shader学习之路——渐变纹理

渐变纹理


可以使用渐变纹理来控制漫反射光照的结果

新的改变

Shader "Custom/RampTextureShader" {
	 Properties {
	  _Color ("Color", Color) = (1,1,1,1)
	  _RampTex ("Ramp Tex", 2D) = "white" {}  //渐变纹理
	  _Gloss ("Gloss", Range(8,255)) = 20
	  _Specular ("Specular", Color) = (1,1,1,1)
 	}
SubShader {
  Pass{
   Tags { "LightMode"="ForwardBase" }
   CGPROGRAM
   #pragma vertex vert
   #pragma fragment frag
   #include "Lighting.cginc"
   
   fixed4 _Color;
   sampler2D _RampTex;
   float _Gloss;
   fixed4 _Specular;
   float4 _RampTex_ST;

struct a2v{
    float3 normal:NORMAL;
    float4 vertex:POSITION;
    float4 texcoord:TEXCOORD0;
   };
   
struct v2f{
    float4 pos:SV_POSITION;
    float3 worldNormal:TEXCOORD0;
    float3 worldPos:TEXCOORD1;
    float uv:TEXCOORD2;
   };
   
v2f vert(a2v v){
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    o.worldNormal = UnityObjectToWorldNormal(v.normal);
    o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
    o.uv = TRANSFORM_TEX(v.vertex,_RampTex);
    return o;
   }
   
   fixed4 frag(v2f o):SV_Target{
    //把法线转换到世界空间并归一化
    fixed3 worldNormal = normalize(o.worldNormal);
    //获得灯光信息并转换到世界空间并归一化
    fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(o.worldPos));
    //得到环境光信息
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    //半伯特公式计算漫反射
    fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5; //把范围映射到[0,-1]
    fixed3 diffuseColor = tex2D(_RampTex,fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;  //纹理映射获得漫反射颜色
    fixed3 diffuse = _LightColor0.rgb * diffuseColor;
    //计算高光
    fixed3 viewDir = normalize(UnityWorldSpaceViewDir(o.worldPos));  
    fixed3 halfDir = normalize(worldLightDir + viewDir);
    fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);
    return fixed4(ambient + diffuse + specular,1.0);
   }
   ENDCG
  }
 }
 FallBack "Diffuse"
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值