U3D各向异性Shader
2016-07-24 16:57
756 查看
原文链接:各向异Shader
一.描述:
这个材质提供了一种类似于在拉丝的金属或头发上的各向异高光。这种各项异性高光基于镜面地图specular map的蓝色通道来与Blinn高光进行混合,同时支持漫反射(diffuse),法线(normal),镜面反射(specular)以及
透明(alphatest)效果。对光泽度(Gloss)和镜面反射度(Specular)的调节同时也会对各向异高光进行影响。
各向异高光的上下偏移可以用shader面板上“Anisotropic Highlight Offset"进行调节。
各向异高光的表面向量使用下列这种图来描述:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/c14fcc8d271de43214173f6a499a6a73)
各向异高光表面向量的数据的存储方式以及表现方式和切线空间下的法线图是一模一样的,但在Unity里面,它不应该使用系统转换为法线贴图.
二.使用参数说明:
Anisotropic Direction:各向异高光的反射方向,与切线空间的法线图中描述方向的规范一样。
Specular:镜像反射控制参数在specular
texture的红通道中,控制高光的亮度
Gloss:光泽度控制参数在specular
texture的绿通道中,这个参数控制各向异高光的锐利程度(0:不锐利,1:最锐利),最好不要把这通道设定为0
Anisotropic Mask:各向异高光与镜面反射定义在specular texture的蓝通道中,这个参数用于混合各向异高光与镜面反射(0:全镜面反射,1:全各向异高光)
Anisotropic Offset:可以控制各向异高光与中心点的距离
三.Shader代码:
一.描述:
这个材质提供了一种类似于在拉丝的金属或头发上的各向异高光。这种各项异性高光基于镜面地图specular map的蓝色通道来与Blinn高光进行混合,同时支持漫反射(diffuse),法线(normal),镜面反射(specular)以及
透明(alphatest)效果。对光泽度(Gloss)和镜面反射度(Specular)的调节同时也会对各向异高光进行影响。
各向异高光的上下偏移可以用shader面板上“Anisotropic Highlight Offset"进行调节。
各向异高光的表面向量使用下列这种图来描述:
各向异高光表面向量的数据的存储方式以及表现方式和切线空间下的法线图是一模一样的,但在Unity里面,它不应该使用系统转换为法线贴图.
二.使用参数说明:
Anisotropic Direction:各向异高光的反射方向,与切线空间的法线图中描述方向的规范一样。
Specular:镜像反射控制参数在specular
texture的红通道中,控制高光的亮度
Gloss:光泽度控制参数在specular
texture的绿通道中,这个参数控制各向异高光的锐利程度(0:不锐利,1:最锐利),最好不要把这通道设定为0
Anisotropic Mask:各向异高光与镜面反射定义在specular texture的蓝通道中,这个参数用于混合各向异高光与镜面反射(0:全镜面反射,1:全各向异高光)
Anisotropic Offset:可以控制各向异高光与中心点的距离
三.Shader代码:
<span style="font-size:14px;">Shader "Bumped Anisotropic Specular" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {} _BumpMap ("Normal (Normal)", 2D) = "bump" {} _AnisoTex ("Anisotropic Direction (Normal)", 2D) = "bump" {} _AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2 _Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5 } SubShader{ Tags { "RenderType" = "Opaque" } CGPROGRAM struct SurfaceOutputAniso { fixed3 Albedo; fixed3 Normal; fixed4 AnisoDir; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; float _AnisoOffset, _Cutoff; inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten) { fixed3 h = normalize(normalize(lightDir) + normalize(viewDir)); float NdotL = saturate(dot(s.Normal, lightDir)); fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180))); float spec = saturate(dot(s.Normal, h)); spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular); fixed4 c; c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2); c.a = 1; clip(s.Alpha - _Cutoff); return c; } #pragma surface surf Aniso #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_AnisoTex; }; sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex; void surf (Input IN, inout SurfaceOutputAniso o) { fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = albedo.rgb; o.Alpha = albedo.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb; o.Specular = spec.r; o.Gloss = spec.g; o.AnisoDir = fixed4(UnpackNormal(tex2D(_AnisoTex, IN.uv_AnisoTex)), spec.b); } ENDCG } FallBack "Transparent/Cutout/VertexLit" }</span>
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- jquery mobile动态添加元素之后不能正确渲染解决方法说明
- 六、访问CGI变量
- Unity3D中脚本的执行顺序和编译顺序
- Unity3D动态对象优化代码分享
- Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作
- Unity3d获取系统时间
- 快速解决js动态改变dom元素属性后页面及时渲染的问题
- javascript表格的渲染组件
- 浏览器加载、渲染和解析过程黑箱简析
- unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android apk)
- Unity3D游戏引擎实现在Android中打开WebView的实例
- unity3d调用手机或电脑摄像头
- Unity3d发布IOS9应用时出现中文乱码的解决方法
- 分享一个开源的网络游戏服务器架构—HouHai
- Android webview(二) 常用设置
- Unity3D插件详细评测及教学下载
- Unity3D上路_01-2D太空射击游戏