简介
给物体换个贴图素材,这本应该是个很简单的问题,由于萌新常识不足,掉进深坑纠结了很久.最后还是大佬同事帮我指了出来… 感谢 感谢
代码
和上一篇相比 只多了贴图相关的几行代码.有几点需要注意一下
1._MainTex_ST
在计算uv偏移量时,有以下两个表达式可以得到偏移后的uv,但你都需要声明一个_MainTex_ST,不论你是否用到这个变量
uv = TRANSFORM_TEX(v.texcoord,_MainTex);
uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
2. tex2D(_MainTex, f.uv) 采样函数
采样函数只能在frag函数里使用,没人跟萌新讲过有这回事啊,萌新全都写在vert函数中了,找了好久好久的bug都不知道问题出在哪里.
顺带一提,报错是这个cannot map expression to vs_4_0 instruction set
3.diffuse 漫反射
注意换了贴图之后 漫反射最后要乘贴图的颜色. 而高光反射没有乘贴图的颜色
Shader "Custom/NewSurfaceShader"
{
Properties{
_Diffuse("Diffuse Color",Color) = (1,1,1,1)//漫反射颜色
_Specular("Specular Color",Color) = (1,1,1,1)//高光颜色
_Gloss("Gloss",Range(8,200)) = 20 //发光强度
_Color("Color",Color) = (1,1,1,1)//贴图颜色
_MainTex("Main Tex",2D) = "white"{}//贴图
}
SubShader
{
pass {
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;//漫反射颜色
fixed4 _Specular;//高光颜色
half _Gloss;//发光强度
fixed4 _Color;//贴图颜色
sampler2D _MainTex;//贴图
fixed4 _MainTex_ST;//这是个语义,纹理名+_ST 代表纹理的缩放与偏移,_MainTex_ST.xy是缩放,_MainTex_ST.zw是偏移.
//f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//这行代码调用了_MainTex_ST做运算
//其实函数TRANSFORM_TEX(v.texcoord, _MainTex)内部就是 v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;
struct a2v {
float4 vertex:POSITION;//赋值模型空间顶点位置
float3 normal:NORMAL;//赋值模型空间法线
float4 texcoord:TEXCOORD0;//第一张贴图
};
struct v2f {
float4 position:SV_POSITION;//输出的屏幕位置
float3 worldNormal:TEXCOORD0;
float3 worldVertex:TEXCOORD1;
float2 uv:TEXCOORD2;
};
v2f vert(a2v v) {
v2f f;
f.position = UnityObjectToClipPos(v.vertex);//世界坐标系下的位置
f.worldNormal = normalize(mul(v.normal, (float3x3) unity_WorldToObject));//世界坐标法线
f.worldVertex = mul(v.vertex, unity_WorldToObject);//世界坐标系下顶点
f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//得到偏移后的uv
return f;
}
fixed4 frag(v2f f) :SV_Target{
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//世界坐标光方向
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));//顶点朝着相机看的方向
fixed3 halfDir = normalize(viewDir + lightDir);//朝向相机的方向与光照方向的和 作为h方向
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(halfDir, f.worldNormal), 0), _Gloss);//h方向与法线的夹角决定高光补偿
fixed3 texColor = tex2D(_MainTex, f.uv) * _Color.rgb;//贴图颜色
fixed3 diffuse = _LightColor0.rgb * max(dot(f.worldNormal, lightDir), 0) *texColor;//漫反射颜色
return fixed4(UNITY_LIGHTMODEL_AMBIENT.rgb*texColor+diffuse+specular,1);
}
ENDCG
}
}
FallBack "Diffuse"
}