UnityShader初级篇——单张纹理

来源:互联网 发布:牛尔的产品怎么样知乎 编辑:程序博客网 时间:2024/05/16 04:40

1.单张纹理的实现

Shader"Unity Shaders Book/Chapter 7/SingleTexture"{Properties{_Color ("Color Tint", Color) = (1,1,1,1)//"White是内置纹理名字,即全白纹理,{}是初始值"_MainTex("MainTex", 2D) = "White" {}_Specular ("Specular", Color) = (1,1,1,1)_Gloss ("Gloss", Range(8.0, 256)) = 20 }SubShader{Pass{        Tags{"LightMode" = "ForwardBase"}                        CGPROGRAM#pragma vertex vert#pragma fragment frag#include "LIghting.cginc"fixed4 _Color;sampler2D _MainTex;//需要用 “纹理名_ST” 的方式定义纹理的属性,S是缩放(scale),T是平移(transform)//_MainTex_ST.xy获取缩放值,_MainTex_ST.zw获取偏移值float4 _MainTex_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;};v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;//变换顶点纹理坐标,先缩放,在平移//o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;//或者直接使用内置宏TRANSFORM_TEX(顶点纹理坐标,纹理名)o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));//使用tex2D(需要被采集的纹理名,纹理坐标)进行纹理采样,再与颜色相乘,返回纹素值fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;//将环境光与纹理素相乘fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//漫反射与纹理素相乘fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));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"}





原创粉丝点击