您的位置:首页 > 移动开发 > Unity3D

unity shader学习笔记(六)——Unity中的基础纹理之渐变纹理

2017-11-12 23:45 204 查看

渐变纹理控制漫反射光照

  这种方法主要是通过将法线方向和光照方向的点积映射到[0, 1]范围内来计算半兰伯特部分,使用这个值来构建一个坐标,然后对纹理进行采样,再和材质颜色相乘,得到最终漫反射的颜色。shader代码如下:

Properties
{
_Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0)
_Gloss("Gloss", Range(8.0, 256)) = 20
_Color("Color", Color) = (1.0, 1.0, 1.0, 1.0)
_RampTex("Ramp Tex", 2D) = "white"{}
}
SubShader
{
Pass
{
Tags{ "LightMode" = "ForwardBase" }

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"

fixed4 _Specular;
float _Gloss;
fixed4 _Color;
sampler2D _RampTex;
float4 _RampTex_ST;

struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};

struct v2f
{
float4 position : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;
};

v2f vert(a2v a)
{
v2f v;
v.position = UnityObjectToClipPos(a.vertex);

//把法线转化为世界坐标下的法线
v.worldNormal = UnityObjectToWorldNormal(a.normal);  //unity 内置函数实现

//把顶点坐标转化为世界坐标
v.worldPos = mul(unity_ObjectToWorld, a.vertex);

//映射纹理坐标
//v.uv = a.texcoord.xy * _RampTex_ST.xy + _RampTex_ST.zw;
v.uv = TRANSFORM_TEX(a.texcoord, _RampTex);  //unity 内置函数实现

return v;
}

fixed4 frag(v2f a) : SV_Target
{
fixed3 worldNormal = normalize(a.worldNormal);

//环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

//光照
fixed3 worldLight = normalize(UnityWorldSpaceLightDir(a.worldPos));  //unity 内置函数实现

//纹理颜色
//fixed3 albedo = tex2D(_RampTex, a.uv).rgb * _Color.rgb;

//漫反射光
fixed lambert = 0.5 * dot(worldNormal, worldLight) + 0.5;
fixed3 diffuse = tex2D(_RampTex, fixed2(lambert, lambert)).rgb * _Color.rgb;

//摄像机方向
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(a.worldPos));  //unity 内置函数实现

//入射光和摄像机方向的中间向量
fixed3 halfDir = normalize(worldLight + viewDir);

//高光反射
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);

//颜色
fixed3 color = ambient + diffuse + specular;

return fixed4(color, 1.0);
}
ENDCG
}
}
FallBack "Specular"


需要注意的是,渐变纹理的 Wrap Mode 需要设置为Clamp模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity