unity shader学习笔记(六)——Unity中的基础纹理之渐变纹理
2017-11-12 23:45
204 查看
渐变纹理控制漫反射光照
这种方法主要是通过将法线方向和光照方向的点积映射到[0, 1]范围内来计算半兰伯特部分,使用这个值来构建一个坐标,然后对纹理进行采样,再和材质颜色相乘,得到最终漫反射的颜色。shader代码如下:Properties { _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0) _Gloss("Gloss", Range(8.0, 256)) = 20 _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) _RampTex("Ramp Tex", 2D) = "white"{} } SubShader { Pass { Tags{ "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Specular; float _Gloss; fixed4 _Color; sampler2D _RampTex; float4 _RampTex_ST; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct v2f { float4 position : SV_POSITION; float3 worldNormal : TEXCOORD0; float3 worldPos : TEXCOORD1; float2 uv : TEXCOORD2; }; v2f vert(a2v a) { v2f v; v.position = UnityObjectToClipPos(a.vertex); //把法线转化为世界坐标下的法线 v.worldNormal = UnityObjectToWorldNormal(a.normal); //unity 内置函数实现 //把顶点坐标转化为世界坐标 v.worldPos = mul(unity_ObjectToWorld, a.vertex); //映射纹理坐标 //v.uv = a.texcoord.xy * _RampTex_ST.xy + _RampTex_ST.zw; v.uv = TRANSFORM_TEX(a.texcoord, _RampTex); //unity 内置函数实现 return v; } fixed4 frag(v2f a) : SV_Target { fixed3 worldNormal = normalize(a.worldNormal); //环境光 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //光照 fixed3 worldLight = normalize(UnityWorldSpaceLightDir(a.worldPos)); //unity 内置函数实现 //纹理颜色 //fixed3 albedo = tex2D(_RampTex, a.uv).rgb * _Color.rgb; //漫反射光 fixed lambert = 0.5 * dot(worldNormal, worldLight) + 0.5; fixed3 diffuse = tex2D(_RampTex, fixed2(lambert, lambert)).rgb * _Color.rgb; //摄像机方向 fixed3 viewDir = normalize(UnityWorldSpaceViewDir(a.worldPos)); //unity 内置函数实现 //入射光和摄像机方向的中间向量 fixed3 halfDir = normalize(worldLight + viewDir); //高光反射 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss); //颜色 fixed3 color = ambient + diffuse + specular; return fixed4(color, 1.0); } ENDCG } } FallBack "Specular"
需要注意的是,渐变纹理的 Wrap Mode 需要设置为Clamp模式。
相关文章推荐
- UnityShader入门精要学习笔记(九):基础纹理之渐变纹理与遮罩纹理
- Unity Shader 基础(4) 由深度纹理重建坐标
- Unity Shaders and Effects Cookbook (1-5)使用2D渐变纹理模拟BRDF(双向反射分布函数)
- unity shader学习笔记(五)——Unity中的基础纹理之凹凸映射
- Unity Shader 基础(3) 获取深度纹理
- unity基础开发--模型导入untiy组件和二维纹理组件
- unity shader学习笔记(四)——Unity中的基础纹理之单张纹理
- Unity Shader入门精要笔记(十四):渐变纹理
- Unity shader学习之渐变纹理
- unity shader学习笔记(七)——Unity中的基础纹理之遮罩纹理
- Unity Shader 学习笔记(9) 渐变纹理、遮罩纹理
- Unity Shaders and Effects Cookbook (1-4) 创建 Ramp Texture(渐变纹理)控制漫反射着色
- [转]Ultra Fractal教程系列16——学习基础技巧08——使用渐变
- [UnityEditor基础]EditorStyles 编辑样式
- C# for Unity 编程语言快速入门教程(连载3)---C#基础编程题库
- Unity UGUI基础之Image
- Unity学习系类笔记5:多人游戏基础
- unity基础开发----Unity新版粒子系统说明
- Unity基础,相机跟随
- 渐变工具基础知识1