- A+
所属分类:UnityShader 原创文章
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Shader "chicai/Texture"{ Properties{ _Texture("Texture",2D) = "white"{} } SubShader{ Pass{ Tags{"RenderMode"="ForwardBase"} CGPROGRAM #include "Lighting.cginc" sampler2D _Texture; float4 _Texture_ST; struct a2v{ float4 pos:POSITION; float3 nor:NORMAL; float4 texcoord:TEXCOORD0; }; struct v2f{ float4 position:SV_POSITION; fixed3 nor:Color0; fixed3 lightDir:Color1; float2 uv:TEXCOORD0; }; #pragma vertex vert #pragma fragment frag v2f vert(a2v i){ v2f o; o.position = UnityObjectToClipPos(i.pos); o.nor = normalize( UnityObjectToWorldNormal(i.nor) ); o.lightDir = normalize ( WorldSpaceLightDir(i.pos) ); o.uv = i.texcoord.xy * _Texture_ST.xy + _Texture_ST.zw; return o; } fixed4 frag(v2f i):SV_Target{ fixed3 col = tex2D(_Texture,i.uv) ; fixed3 diff = _LightColor0.rgb * col * ( dot(i.lightDir,i.nor)/2 + 0.5 ) ; fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; return fixed4(diff + ambient,0); } ENDCG } } } |
在这里就不加多其他的效果了,漫反射贴图。这里想讲讲整个流程,巩固一下,发现自己好像几个星期没写就好像不会了
一、声明shader的路径和名称
1 |
Shader "chicai/Texture" |
二、声明属性,在Unity上进行赋值的,格式:cg名称(显示名称,类型)=默认值
1 2 3 |
Properties{ _Texture("Texture",2D) = "white"{} } |
对应这的cd声明变量为
1 2 |
sampler2D _Texture;//对应上面Properties声明的变量 float4 _Texture_ST;//自然对应的贴图的缩放平移等 |
第二个变量是贴图特有的,Unity会自动赋值,变量名为:贴图名+_ST
三、两个结构体:
1 2 3 4 5 6 7 8 9 10 11 12 |
struct a2v{ float4 pos:POSITION;//顶点 float3 nor:NORMAL;//法线 float4 texcoord:TEXCOORD0;//uv坐标 }; struct v2f{ float4 position:SV_POSITION;//确定位置 fixed3 nor:Color0;//用来计算与关照方向的夹角 fixed3 lightDir:Color1;//计算漫反射 float2 uv:TEXCOORD0;//取贴图颜色信息 }; |
a2v里面的变量类型都是模型传进来的原始数据,然后通过顶点函数处理封装到v2f传给片元函数
看看顶点函数:
1 2 3 4 5 6 7 8 |
v2f vert(a2v i){ v2f o; o.position = UnityObjectToClipPos(i.pos);//剪裁空间 o.nor = normalize( UnityObjectToWorldNormal(i.nor) );//世界坐标下的法线 o.lightDir = normalize ( WorldSpaceLightDir(i.pos) );//世界坐标下的光照方向 o.uv = i.texcoord.xy * _Texture_ST.xy + _Texture_ST.zw;//模型的uv和贴图的缩放平移处理 return o;//传递给片元 } |
四、片元函数
1 2 3 4 5 6 7 8 |
fixed4 frag(v2f i):SV_Target{ fixed3 col = tex2D(_Texture,i.uv) ;//通过uv和贴图,获取uv点上贴图的颜色信息 fixed3 diff = _LightColor0.rgb * col * ( dot(i.lightDir,i.nor)/2 + 0.5 ) ;//漫反射计算 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光 return fixed4(diff + ambient,0); } |
主要的方法就是tex2D了,传递一个由Unity外部指定的贴图,再一个经过顶点函数处理过的uv坐标,获取到的颜色就是目标顶点(像素)上对应的自身颜色了
五、最后,看一下效果