渐变纹理

Shader"Unity Shaders Book/Chapter 7/Ramp Texture"{

Properties

{

_Color ("Color Tint", Color) = (1,1,1,1)

//"White是内置纹理名字,即全白纹理,{}是初始值" _RampTex("Ramp Text", 2D) = "white" {}

_Specular ("Specular", Color) = (1,1,1,1)

_Gloss ("Gloss", Range(8.0, 256)) = 20

}

SubShader

{

Pass

{

        Tags{"LightMode" = "ForwardBase"}


CGPROGRAM

#pragmavertex vert #pragmafragment frag #include "LIghting.cginc" fixed4 _Color;

sampler2D _RampTex;

//定义_RampTex的纹理属性变量 float4 _RampTex_ST;

fixed4 _Specular;

float _Gloss;

struct a2v

{

float4 vertex : POSITION;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

};

struct v2f

{

        float4 pos : SV_POSITION;

        float3 worldNormal : TEXCOORD0;

        float3 worldPos : TEXCOORD1;

        float2 uv : TEXCOORD2;

};

v2fvert(a2v v){

v2f o;

o.pos = UnityObjectToClipPos(v.vertex);

o.worldNormal = UnityObjectToWorldNormal(v.normal);

o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

//使用内置宏TRANSFORM_TEX(顶点纹理坐标,纹理名)计算经过平铺和偏移后的纹理坐标 o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);

return o;

}

fixed4frag(v2f i) : SV_Target{

fixed3 worldNormal = normalize(i.worldNormal);

fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz ;

//使用半兰伯特模型构建一个纹理坐标,使用此坐标对渐变纹理进行采样,uv方向都使用半兰博特,最后将渐变纹理与材质纹理相乘 fixed halfLambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;

fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Color.rgb;

fixed3 diffuse = _LightColor0.rgb * diffuseColor;

fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));

fixed3 halfDir = normalize(worldLightDir + viewDir);

fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal,halfDir)), _Gloss);

return fixed4(ambient + diffuse + specular,1.0);

; }

ENDCG

}

}

Fallback"Specular"}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容