shader里面光照计算毕竟还是比较复杂的,于是想到下面的性能相对好一些的方案。

  美术提供一张Diffuse贴图,一张lightmap贴图,然后在应用一个自定义的全局的环境光效果,来模拟静态的光照。

  每个模型单独提供自己的lightmap贴图,而不是使用场景烘焙出来的包含所有物体的liangmap,这样做的好处是比较灵活,同一个物体在不同地方提供不同的lightmap贴图即可。

  1. Shader "James/Scene/Diffuse Lightmap"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Base (RGB)", 2D) = "white" {}
  6. _Lightmap ("Light Map", 2D) = "white" {}
  7. }
  8.  
  9. SubShader
  10. {
  11. Tags { "RenderType"="Opaque" "Queue"="Geometry" }
  12. LOD
  13.  
  14. Pass
  15. {
  16. Tags { "LightMode"="ForwardBase" }
  17. Lighting Off
  18.  
  19. CGPROGRAM
  20. #pragma fragmentoption ARB_precision_hint_fastest
  21.  
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. #pragma multi_compile_fog
  25.  
  26. #include "UnityCG.cginc"
  27. #include "JamesLighting.cginc"
  28.  
  29. uniform sampler2D _MainTex;
  30. uniform half4 _MainTex_ST;
  31.  
  32. UNITY_DECLARE_TEX2D(_Lightmap);
  33.  
  34. struct vertexIN_base
  35. {
  36. float4 vertex : POSITION;
  37. float3 normal : NORMAL;
  38. float2 texcoord : TEXCOORD0;
  39. float2 uv2 : TEXCOORD1;
  40. };
  41.  
  42. struct v2f_base
  43. {
  44. float4 pos : SV_POSITION;
  45. half4 uv : TEXCOORD0;
  46. UNITY_FOG_COORDS()
  47. };
  48.  
  49. inline half3 JamesDecodeLightmapDoubleLDR( half4 color)
  50. {
  51. #if defined(UNITY_COLORSPACE_GAMMA)
  52. return color.rgb * ;
  53. #else
  54. return color.rgb * 4.59;
  55. #endif
  56. }
  57.  
  58. v2f_base vert(vertexIN_base v)
  59. {
  60. v2f_base o;
  61. o.pos = UnityObjectToClipPos(v.vertex);
  62. o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
  63. o.uv.zw = v.uv2;
  64.  
  65. UNITY_TRANSFER_FOG(o,o.pos);
  66. return o;
  67. }
  68.  
  69. fixed4 frag(v2f_base i) : COLOR
  70. {
  71. half4 bakedColorTex = UNITY_SAMPLE_TEX2D(_Lightmap, i.uv.zw);
  72. half3 bakedColor = JamesDecodeLightmapDoubleLDR(bakedColorTex);
  73.  
  74. half4 mainColor = tex2D(_MainTex, i.uv.xy);
  75. half4 clr = mainColor;
  76. clr.rgb *= bakedColor + (AMBIENT_COLOR).rgb;
  77.  
  78. UNITY_APPLY_FOG(i.fogCoord,clr);
  79.  
  80. return clr;
  81. }
  82. ENDCG
  83. }
  84. }
  85. FallBack Off
  86. }

Diffuse贴图+Lightmap+Ambient的更多相关文章

  1. Unity Shader-法线贴图(Normal)及其原理

    简介 以前经常听说“模型不好看啊,怎么办啊?”答曰“加法线”,”做了个高模,准备烘一下法线贴图”,“有的美术特别屌,直接画法线贴图”.....法线贴图到底是个什么鬼,当年天真的我真的被这个图形学的奇淫 ...

  2. Texture 纹理贴图

    基础贴图Shader:只有纹理 1. 在属性中声明纹理贴图: _MainTex ("Texture", 2D) = "white" {} 2. 在Pass中声明 ...

  3. 一个unity3d lightmap问题

    上周美术同学在使用unity3d制作lightmap的过程中,发现部分被lightmap影响的模型在移动端上效果与pc端不一致.当时我大概看了下,分析后,得到一个结论是“在移动端上lightmap的h ...

  4. 【Aladdin Unity3D Shader编程】之四 贴图纹理

    关于纹理贴图介绍 纹理坐标也叫UV坐标,UV坐标都是0~1,并不是我们所理解的像素坐标,相当于是一个百分比. 编写shader映射纹理 将纹理的颜色取代漫反射的颜色 Shader "Alad ...

  5. LearnOpenGL.PBR.工作流贴图

  6. 一个有趣的模拟光照的shader(类似法线贴图)

    最近使用unity,碰到到一个很有趣的例子.场景无光线,却模拟出了光照,效果挺好.其思路与法线贴图原理异曲同工. 原作者提供的效果印象深刻. 模型除了使用原来的diffuse贴图外,还用到了一张模拟记 ...

  7. 3DMax脚本插件--改动材质&贴图名称

    从网上淘到了一套人物的模型,当时的心情是激动无比,掏出用的不熟练的3DMax折腾了半天.突然发现了一个蛋疼的事儿,所有的模型文件,材质名称,子材质,以及贴图所实用的是中文命名!! ! 尽管说是能跑,只 ...

  8. unity texture贴图纹理

    文章内一些内容引用自作者:Aimar_Johnny http://blog.csdn.net/lzhq1982/article/details/75045358 导入png图片,默认显示如下 Text ...

  9. 深度剖析Istio共享代理新模式Ambient Mesh

    摘要:今年9月份,Istio社区宣布Ambient Mesh开源,由此引发国内外众多开发者的热烈讨论. 本文分享自华为云社区<深度剖析!Istio共享代理新模式Ambient Mesh>, ...

随机推荐

  1. Android编译环境配置(Ubuntu 14.04)

    常识:编译Android源代码需要在Linux系统环境下进行... 在Linux中,开发Android环境包括以下需求:Git.repo.JDK(现在一般使用OpenJDK)等:其中,Git用于下载源 ...

  2. php数组和对象转换函数

    /**  * 数组 转 对象  *  * @param array $arr 数组  * @return object  */ function array_to_object($arr) {     ...

  3. JS Function类型

    每个函数都是Function类型的实例,由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定. 1.函数的声明: (1)函数声明语法: function sum (num1,num ...

  4. Redis 数据变化通知服务实践

    从Redis 2.8.0版本起,Redis加入了“Keyspace notifications”(即“键空间通知”)的功能.键空间通知,允许Redis客户端从“发布/订阅”通道中建立订阅关系,以便客户 ...

  5. Jsp俩大内置对象学习

    https://www.cnblogs.com/smyhvae/p/4065790.html post与get的区别 最直观的区别就是GET把参数包含在URL中,POST通过request body传 ...

  6. 三种进程和线程数据共享模块方法Queue》Pipe》manager

    >>>>线程中的queue import threading import queue def f(qq): print("in child",qq.qsi ...

  7. Linux之通配符实验

    作业五:通配符实验 反引号与()在此时都是表死获取结果 但是一般使用()的方式,因为反引号在多个反引号的时候无法正确指代 获取当前bash 的变量 echo $变量名 echo $? 表示上一次命令的 ...

  8. poj3276 Face The Right Way(反转问题,好题)

    https://vjudge.net/problem/POJ-3276 首先意识到,对一个区间进行两次及以上的反转是没有意义的,而且反转次序不影响最终结果. 有点像二分搜索时用的逐个试的方法,每次翻的 ...

  9. datasnap isapi程序iis设置

    datasnap isapi程序iis设置 添加ISAPI和CGI限制: 处理程序映射---添加模块映射: IIS应用程序池要如下设置: 停止ISAPI部署服务

  10. Python3 与 NetCore 基础语法对比(Function专栏)

    Jupyter最新排版:https://www.cnblogs.com/dotnetcrazy/p/9175950.html 昨晚开始写大纲做demo,今天牺牲中午休息时间码文一篇,希望大家点点赞 O ...