Unity3D ShaderLab布料着色器

布料着色器是我们在虚拟现实中经常使用的着色器。本篇就来完成一个较为简单的布料着色器。

新建Shader,Material,InteractiveCloth【布料】。完成的代码如下

  1. Shader "91YGame/ClothShader" {
  2. Properties {
  3. //参数;
  4. _MainTint("Base Color",Color)=(,,,)
  5. _BumpMap ("Normal Map", 2D) = "bump" {}
  6. _DetailBump("Detail Normal",2D)=""{}
  7. _DetailTex("Fabric Weave",2D)=""{}
  8. _FresnelColor("Fresnel Color",Color)=(,,,)
  9. _FresnelPower("Fresnel Power",Range(0.01,))=
  10. _RimPower("Rim Falloff",Range(0.01,))=
  11. _SpecIntesity("Specular Intensity",Range(0.01,))=0.3
  12. _SpecWidth("Specular Width",Range(0.01,))=0.2
  13.  
  14. }
  15. SubShader {
  16. Tags { "RenderType"="Opaque" }
  17. LOD
  18.  
  19. CGPROGRAM
  20. #pragma surface surf VelvetCloth
  21. #pragma target 3.0
  22. //变量;
  23. sampler2D _BumpMap;
  24. sampler2D _DetailBump;
  25. sampler2D _DetailTex;
  26. float4 _MainTint;
  27. float4 _FresnelColor;
  28. float _FresnelPower;
  29. float _RimPower;
  30. float _SpecIntesity;
  31. float _SpecWidth;
  32. //输入结构体;
  33. struct Input {
  34. float2 uv_BumpMap;
  35. float2 uv_DetailBump;
  36. float2 uv_DetailTex;
  37. };
  38.  
  39. inline fixed4 LightingVelvetCloth(SurfaceOutput s,fixed3 lightDir, fixed3 viewDir, fixed atten){
  40. //光照向量;
  41. viewDir =normalize(viewDir);
  42. lightDir = normalize(lightDir);
  43. half3 halfVec = normalize(lightDir+viewDir);
  44. fixed NdotL = max(0.01,dot(s.Normal,lightDir));
  45. //计算高光;
  46. float NdotH = max(0.01,dot(s.Normal,halfVec));
  47. float spec = pow(NdotH,s.Specular*)*s.Gloss;
  48. //视线越贴近布料表面,纤维吸收的背面光就越多,高光也就越强;
  49. float HdotV = pow(-max(,dot(halfVec,viewDir)),_FresnelPower);
  50. float NdotE = pow(-max(,dot(s.Normal,viewDir)),_RimPower);
  51. float finalSpecMask = NdotE*HdotV;
  52. //最终颜色;
  53. fixed4 c;
  54. c.rgb = (s.Albedo*NdotL*_LightColor0.rgb)+(spec*(finalSpecMask*_FresnelColor))*(atten*);
  55. c.a =;
  56. return c;
  57. }
  58.  
  59. void surf (Input IN, inout SurfaceOutput o) {
  60. half4 c = tex2D (_DetailTex, IN.uv_DetailTex);
  61. //提取法线;
  62. fixed3 normals = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap)).rgb;
  63. fixed3 detailNormals = UnpackNormal(tex2D(_DetailBump,IN.uv_DetailBump)).rgb;
  64. fixed3 finalNormals = float3(normals.x+detailNormals.x,normals.y+detailNormals.y,normals.z+detailNormals.z);
  65. o.Normal = normalize(finalNormals);
  66. o.Specular = _SpecWidth;
  67. o.Gloss = _SpecIntesity;
  68. o.Albedo = c.rgb*_MainTint;
  69. o.Alpha = c.a;
  70. }
  71. ENDCG
  72. }
  73. FallBack "Diffuse"
  74. }

返回Unity,设置变量。最终效果如下:

在上面的实现过程中,我们将两张不同平铺率的法线贴图结合到一起。计算出新的法线向量。

所以使用UnpackNormal从变化法线贴图中提取出法线向量在产生新的法线贴图。然后使用normalize对最后的向量进行归一化,这样可以避免法线贴图看起来杂乱。

最后 将菲涅尔计算和高光计算的结果进行合并,创建出布料的纤维效果。

Unity3D ShaderLab 布料着色器的更多相关文章

  1. Unity3D内置着色器

    Unity内部提供了一些可以直接使用的着色器,这些内置着色器包括以下6个方面: (1)Performance of Unity shaders 着色器的性能和两个方面有关:shader本身和rende ...

  2. 【Unity Shaders】Lighting Models —— 衣服着色器

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

  4. Unity3D ShaderLab 使用渐变纹理着色

    Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片 ...

  5. Unity3D - 图形性能优化:优化着色器载入时间

    Unity官方文档之"图形性能优化-优化着色器载入时间"的翻译,E文链接. Optimizing Shader Load Time 优化着色器载入时间 Shaders are sm ...

  6. Unity3D着色器Shader编程入门(一)

    自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考. 因Shader是对图像图像渲染的,学习前可以去了解 ...

  7. Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合

    一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...

  8. Unity3D学习笔记(三十四):Shader着色器(1)

    一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似.   GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...

  9. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

随机推荐

  1. hat linux下vnc的安装

    1.在系统文件下找到vnc的rpm包(检测是否安装vnc) 系统文件寻找方法 进入到根目录(可通过pwd确认当前目录,/则表示根目录) 根目录下有个一个media,进入此目录 media目录下有个一个 ...

  2. Quoted-printable 编码介绍、编码解码转换

    求教,“=B9=A4=D7=F7=BC=F2=B1=A8” 这种是什么编码方式? Quoted-printable 可译为“可打印字符引用编码”.“使用可打印字符的编码”,我们收邮件,查看信件原始信息 ...

  3. Skrollr.js -- 使用Skrollr创建视差滚动效果页面

    使用方法:  http://www.helloweba.com/view-blog-262.html http://www.uedsc.com/skrollr.htmlhttp://www.hello ...

  4. 使用drawBitmapMesh扭曲图像

    Canvas提供了一个drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, pai ...

  5. 小记:利用递归调用循环寻找MP3文件的方法。

    private void findMp3Data(File mp3file) { File[] filelist = mp3file.listFiles(); if (filelist != null ...

  6. iOS 文件读写

    #import <Foundation/Foundation.h> @interface Utils : NSObject +(void) writeFile:(NSString *) f ...

  7. City Skyline

    题目大意:(poj 3044) 给出城市的正视图,所有的大楼都是矩形,给出正视图每个高度改变时的坐标,问最少有多少大楼.一共N个矩形,N<=50000 解题过程: 首先可以把问题转化一下:有N块 ...

  8. [开发笔记]-VS2012打开解决方案崩溃或点击项目崩溃

    下午在使用VS2012建立Service服务项目时,只要一切换到设计视图页面中,VS就崩溃重启,从网上找了一种方法来解决,测试可行.但导致该问题的原因未知. 解决方案: 步骤1:开始-->所有程 ...

  9. HDU 4087 三维上的平移缩放旋转矩阵变化

    题目大意: 就是根据它给的程序的要求,不断平移,缩放,旋转三维的点,最后计算出点的位置 这里主要是要列出三种转换方式的齐次矩阵描述 平移translate tx ty tz1 0 0 00 1 0 0 ...

  10. CCNA 6.5

    no sh (no shutdown : start the interface)   router rspf 1 network x.x.x.x x.x.x.x area 0 int (interf ...