导读
我们自己如何编写Shader程序,来使用贴图呢? 首先我们会先介绍贴图属性,然后再是Shader程序示例。
贴图属性
unity中导入一张图片,可看到有如下属性,我们使用默认属性即可。
Texture Type:图片类型
- Default:用于所有纹理的最常见纹理类型
- Normal map:法线贴图
- Editor GUI and Legacy GUI:编辑器的GUI和传统的GUI
- Sprite(2D and UI):图片精灵
- Cursor:设为光标
- Cookie:聚光灯贴图
- Lightmap:光照贴图
- Advanced:高级选项
Texture Shape
使用 Texture Shape 属性可选择和定义纹理的形状和结构。有四种形状类型:
- 2D 是用于所有纹理的最常用设置;它将图像文件定义为 2D 纹理。这些设置用于将纹理映射到 3D 网格和 GUI 元素以及其他项目元素。
- Cube 将纹理定义为立方体贴图。例如,可将其用于天空盒或反射探针。此类型仅可用于 Default、Normal Map 和 Single
Channel 纹理类型。 - 2D Array 将纹理定义为 2D 数组纹理。这通常用作某些渲染技术的优化,其中会使用许多具有相同大小和格式的纹理。
- 3D 将纹理定义为 3D 纹理。某些渲染技术使用 3D 纹理表示体积数据。
Wrap Mode
选择纹理平铺时的行为方式。默认选项为 Repeat。 All Texture Types
- Repeat 在区块中重复纹理。
- Clamp 拉伸纹理的边缘。
- Mirror 在每个整数边界上镜像纹理以创建重复图案。
- Mirror Once 镜像纹理一次,然后将其钳制到边缘像素。注意:某些移动设备不支持 Mirror Once
模式。在这种情况下,Unity 将改用 Mirror 模式。 - Per-axis 选择此选项可单独控制 Unity 如何在 U 轴和 V 轴上包裹纹理。
Fiter mode
选择纹理在通过 3D 变换拉伸时如何进行过滤。默认选项为 Bilinear。
- oint :点采样模式,屏幕像素会需找最近的贴图像素点,来作为输出,这种比较生硬,但是性能好,不抗锯齿。
- Bilinear :双线性采样模式, 采用最近的4个像素来做线性插值,有平缓的过渡。可以解决贴图放大的问题,但是贴图缩小依然有锯齿。缩小可以用mip-map来解决。
- Trilinear :三线性采样模式,可以比较好的解决贴图缩小和放大。
Shader贴图示例
新建材质
新建Shader文件
编写Shader示例程序
关键函数
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导入材质
这里我们可以把Shader拖入到材质上,也可以手动选择,如下:
材质呈现效果
这里我们把图片导入,可看到材质球效果
把材质球应用到Scene物体上,效果如下