美文网首页
渐变纹理

渐变纹理

作者: 冰冰棒bling | 来源:发表于2019-05-06 18:27 被阅读0次

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"}

相关文章

网友评论

      本文标题:渐变纹理

      本文链接:https://www.haomeiwen.com/subject/bhwdoqtx.html