我们自己如何编写Shader程序,来使用贴图呢? 首先我们会先介绍贴图属性,然后再是Shader程序示例。
unity中导入一张图片,可看到有如下属性,我们使用默认属性即可。
使用 Texture Shape 属性可选择和定义纹理的形状和结构。有四种形状类型:
选择纹理平铺时的行为方式。默认选项为 Repeat。 All Texture Types
选择纹理在通过 3D 变换拉伸时如何进行过滤。默认选项为 Bilinear。
关键函数
tex2D我的理解是把外部引入的贴图的UV坐标,与模型的UV坐标对应起来,输出颜色值
tex2D(_MainTex,f.uv.xy);
Shader "My/tietu"
{
Properties
{
_MainTex("Main Tex",2D) = "white"{}
_Range("Range",Range(0,1)) = 0.5
}
SubShader
{
Tags{"LightMode" = "ForwardBase" }
Pass{
CGPROGRAM
#include "Lighting.cginc"
sampler2D _MainTex;
#pragma vertex vert;
#pragma fragment frag;
float _Range;
struct a2v
{
float4 vertex:POSITION;
float4 texcoord:TEXCOORD0;
float3 normal:NORMAL;
};
struct v2f
{
float4 uv:TEXCOORD0;
float4 svPos:SV_POSITION;
float3 normal:TEXCOORD1;
};
v2f vert(a2v v)
{
v2f f;
f.svPos = UnityObjectToClipPos(v.vertex);
f.uv = v.texcoord;
f.normal = UnityObjectToWorldNormal(v.normal);
return f;
}
fixed4 frag(v2f f):SV_Target{
fixed3 texColor = tex2D(_MainTex,f.uv.xy);
fixed3 normalDir = normalize(f.normal);
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 texColo = _LightColor0.rgb*_Range*texColor*max(0,dot(normalDir,lightDir)*0.5+0.5);
fixed3 color = texColo+UNITY_LIGHTMODEL_AMBIENT.rgb;
return fixed4(color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
这里我们可以把Shader拖入到材质上,也可以手动选择,如下:
这里我们把图片导入,可看到材质球效果
把材质球应用到Scene物体上,效果如下