如图所示:

这个地面是绿色的,在没有烘焙之前,上面的球体和立方体都是黑色的。
地面使用的材质是A,它使用的shader是unity自己的standard着色器。
上面的球体和立方体使用的材质B,它使用的shader是我们自己编写的shader,这个在博客:
https://blog.csdn.net/wodownload2/article/details/90450421
中有具体的内容。就是采样烘焙之后的光照贴图。

烘焙之后:

球体和上面的立方体都会被地板的绿色所影响。
也就是说对于自发光的物体,经过烘焙之后,它会对周围的物体产生影响,其间接光信息会被记录在光照贴图中。

金属工作流:DiffuseAndSpecularFromMetallic
关于这个话题,参考:https://catlikecoding.com/unity/tutorials/rendering/part-4/

4.3节 金属工作流

我们日常打交道的有两个基本的分类,一个是金属,另外一个非金属。非金属也叫绝缘材质。目前,我们可以通过设置很强的specular tint来创建一个金属。而用一个很弱的单色镜面反射,来创建一个绝缘材质,这个就是镜面反射工作流。

如果我们能在金属和非金属之间切换这样会更简单一些。由于金属没有漫反射,所以我们能够使用颜色数据来代替specular tint。而非金属呢没有镜面反射,所以我们根本不需要specular tint。这个就是金属工作流。

哪个是更好的工作流呢?
两个方法都很好。这就是为啥unity对每个方法都实现了一个标准的shader。金属工作流更加的简单,因为你只有一个滑动条和一个颜色。这个能够很好的创建写实的材质了。镜面工作流也可以产生同样的效果,但是你需要更多的控制,非写实的材质也能被创建出来。

我们可以使用另外一个滑动条,作为金属开关,来代替specular tint。典型的,它应该是0或者1,因为一个东西要么是金属,要么是非金属。在0到1之间,则是金属和非金属的混合。

 Properties {_Tint ("Tint", Color) = (1, 1, 1, 1)_MainTex ("Albedo", 2D) = "white" {}
//      _SpecularTint ("Specular", Color) = (0.5, 0.5, 0.5)_Metallic ("Metallic", Range(0, 1)) = 0_Smoothness ("Smoothness", Range(0, 1)) = 0.1}…//            float4 _SpecularTint;float _Metallic;float _Smoothness;

这样我们就可以从albedo和metallic属性中得到specular tint了。albedo就简单通过1-metallic 得到。

         float3 specularTint = albedo * _Metallic;float oneMinusReflectivity = 1 - _Metallic;
//              albedo = EnergyConservationBetweenDiffuseAndSpecular(
//                  albedo, _SpecularTint.rgb, oneMinusReflectivity
//              );albedo *= oneMinusReflectivity;float3 diffuse =albedo * lightColor * DotClamped(lightDir, i.normal);float3 halfVector = normalize(lightDir + viewDir);float3 specular = specularTint * lightColor * pow(DotClamped(halfVector, i.normal),_Smoothness * 100);

但是,这个过于简化。因为即使是纯的绝缘体也会有一点的镜面反射。所以镜面反射强度和反射值和金属滑动条的值不匹配。这个和颜色空间有关系,幸运的是,UnityStandardUtils有一个方法DiffuseAndSpecularFromMetallic ,为我们考虑到这个问题了。

float3 specularTint; // = albedo * _Metallic;
float oneMinusReflectivity; // = 1 - _Metallic;
//              albedo *= oneMinusReflectivity;
albedo = DiffuseAndSpecularFromMetallic(albedo, _Metallic, specularTint, oneMinusReflectivity
);

一个细节就是金属滑动条支持gamma空间。但是简单的值是不会被unity进行gamma矫正的,当使用线性空间的时候。我们可以使用Gamma属性来告诉unity,我们需要对metallic滑动条进行gamma矫正。

[Gamma] _Metallic ("Metallic", Range(0, 1)) = 0

不幸的是,镜面反射对于非金属材质表现还是比较模糊的,所以我们需要一个更好的计算光照的方法,这个就是基于物理的渲染PBS。

如果上面的屋顶是透明的情况,烘焙有没有影响呢。

透明物体怎么写shader
下面我么要写一个透明的物体的shader。

透明物体首先要有要给标签,而且这个标签是subshader层级的, 不能放在pass中。

我们提供一个枚举来来选择物体是否是透明物体。

 public enum ObjectType{Opaque,Transparent,}

下面是shader代码:

Shader "My/My First Lighing Shader"
{Properties{_Color("Tint",Color)= (1,1,1,1)_MainTex("MainTex",2D) = "white"{}[HideInInspector] _SrcBlend("_SrcBlend", Float) = 1[HideInInspector] _DstBlend("_DstBlend", Float) = 0[HideInInspector] _zWrite("_ZWrite", Float) = 1}SubShader{Pass{Blend[_SrcBlend][_DstBlend]ZWrite[_ZWrite]CGPROGRAM#pragma vertex MyVertexProgram#pragma fragment MyFragmentProgram#pragma multi_compile _ _Transparent#include "UnityCG.cginc"#include "My Lighting.cginc"ENDCG}}CustomEditor "ShaderUI"
}

需要一个变体_Tranparent,所以使用#pragma multi_compile _ _Transparent

然后需要在不透明的时候,设置一个渲染模式。在透明的时候,需要另外要给渲染模式。

 public struct RenederSettings{public RenderQueue queue;public BlendMode srcBlend, dstBlend;public bool zWrite;public static RenederSettings[] settings ={new RenederSettings(){queue = RenderQueue.Geometry, //不透明物体srcBlend = BlendMode.One, //混合方式 1 0dstBlend = BlendMode.Zero,zWrite = true //不透明物体是开启深度测试,并且写入},new RenederSettings(){queue = RenderQueue.Transparent, //透明物体srcBlend = BlendMode.SrcAlpha, //源alphadstBlend = BlendMode.OneMinusSrcAlpha, //1-srcAlphazWrite = false    //关闭深度写入,防止发生闪烁}};}

#if !defined(MY_LIGHTINGdddd)
#define MY_LIGHTINGdddd
#include "Lighting.cginc"float4 _Color;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;struct VertexData
{float4 vertex:POSITION;float2 uv:TEXCOORD0;float2 uv1:TEXCOORD1;
};struct Interpolators
{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;float2 lightmapUV:TEXCOORD1;
};struct FragmentOutput
{float4 color:SV_Target;
};Interpolators MyVertexProgram(VertexData v)
{Interpolators i;i.pos = UnityObjectToClipPos(v.vertex);i.uv = TRANSFORM_TEX(v.uv, _MainTex);i.lightmapUV = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw;return i;
}FragmentOutput MyFragmentProgram(Interpolators i)
{FragmentOutput output;#if defined(_Transparent) output.color = tex2D(_MainTex, i.uv)*_Color.a;#elseoutput.color = float4(DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.lightmapUV)),1);#endifreturn output;
}#endif

如果是透明物体,则采样主纹理和乘以_Color.a;
如果是不透明物体,则直接采样光照贴图。

自发光物体能被烘焙之后是否会影响周围的物体相关推荐

  1. 解决物体位姿估计中遮挡、对称、无纹理物体的方法

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自知乎物体6D位姿估计专栏,已获作者授权转载,请勿二次转载. https://zhuanlan.zhihu.com/p/89830618 本文解 ...

  2. 电容屏物体识别_一种基于触摸屏触摸点的物体识别方法与流程

    本发明涉及触摸屏触摸点物体识别技术领域,具体为一种基于触摸屏触摸点的物体识别方法. 背景技术: 多触点触摸屏支持多个触点同时输入,通过触摸屏的点的特征,进行物体识别是一个成熟的技术,以下简称物体识别为 ...

  3. 求表面积和体积。 读入5个整数a, b, c, d 和 e,计算物体的表面积和体积。你可以想像该物体是一个长宽高为a, b, c 的长方体,每中央都是凹进去的,而凹进去的深度为 d,沒凹进

    题目描述: 读入5个整数a, b, c, d 和 e,计算物体的表面积和体积.你可以想像该物体是一个长宽高为a, b, c 的长方体,每一面中央都是凹进去的,而凹进去的深度为 d,沒凹进去的边框宽度 ...

  4. 基于ROS机器人的3D物体识别与三维重建(三)基于ROS的3D物体识别

    Kinect2相机标定与点云数据获取 1.介绍 2 基于Gazebo搭建物体识别仿真环境 2.1 Gazebo简介 2.2 创建仿真环境 3 三维物体识别 3.1 基于模板匹配的物体识别流程 3.2 ...

  5. Unity - Meta Pass 给 Bake GI 的 Emission 自发光等信息无法烘焙到 Lightmap 中的问题

    文章目录 环境 问题 解决 解放方案1 - 直接在 Inspector Debug 模型下编辑材质的 Lightmap Flags 解决方案2 - 脚本批量设置材质的 MaterialGlobalIl ...

  6. 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)

    中班科学活动滚动的物体教案(附教学反思)主要包含了活动目标,活动准备,活动过程,活动反思等内容,对物体的滚动产生探究的兴趣,积极参与操作活动,感知物体滚动的特性,适合幼儿园老师们上中班科学活动课,快来 ...

  7. opencv用python进行物体识别_教你用Python+opencv来识别物体的轮廓并标识显示

    实现目标 利用USB摄像头对拍摄的物体进行轮廓识别并标识显示 打开pycharm开发工具,在项目中新建 demo.py 文件,文件代码如下: # 调用对应的库 import cv2 # 视频参数设置 ...

  8. python识别图像中的物体_python爬虫-利用百度api识别照片中的物体

    我会了,您呢 开门见山,我直接开始了,这真的只是体验课,不值得我体验一整天的时间,我花了半小时. 基础不需要,会认字就行.软件:pycharm,py3.x/py2.x,两个都行,我用的3. 需要自己有 ...

  9. python识别视频中某个物体的轨迹_用Matlab来识别视频中物体的运动轨迹!

    对于很多生命科学领域的研究者来说,研究生物的行为是很多人研究工作中必不可少的部分.在进行生物行为研究工作的时候,生物的运动又是重中之重.这这里我以小鼠的一段运动视频为例,教大家用Matlab来分析视频 ...

  10. 法向量影响光源照射物体后,物体产生的视觉感光效果

    gemo.computeVertexNormals()     更加贴近人眼看到的效果 gemo.computeFaceNormals()     计算机默认自动生成的方式 转载于:https://w ...

最新文章

  1. linux下移动c盘文件位置,问个问题我在unbuntu下为何找不到windows c盘文件
  2. 面试官问:说说悲观锁、乐观锁、分布式锁?都在什么场景下使用?有什么技巧?...
  3. gj6 深入python的set和dict
  4. java变量名转字符串_JS中将变量转为字符串
  5. vb.net怎么调用fastreport报表_财务分析-企业财务管理报表模板制作实现智能化的财务运营...
  6. TFS版本管理(八)
  7. IE浏览器各版本的CSS Hack
  8. vue 指令 v-on 事件修饰符-鼠标事件-什么是事件冒泡
  9. Dropbox Interview – Design Hit Counter
  10. ffdshow神奇的功能:视频播放时显示运动矢量和QP
  11. 传输线应用基础,阻抗匹配与谐波控制
  12. 洞察药监局数据,挖掘万亿价值
  13. 电源测试之输出动态响应(Output Dynamic Response Test)
  14. yourshelf是什么意思中文_[英语shelf的中文是什么意思]英语shelf的中文是什么意思...
  15. 2015年8月4日工作日志--------赵鑫
  16. android启动页广告图,一张图搞定APP启动页广告
  17. uniapp手机号一键登录
  18. springboot 整合 mqtt 实现消息订阅
  19. vimdesktop --goreliu 版本配置
  20. 5分钟读懂设计模式(2)---装饰者模式

热门文章

  1. can的总结——笑笑
  2. SuperMap基本概念
  3. Eason Chan
  4. 关于SIM800C 2G通信模块的电路设计上需要注意的地方
  5. 程序员面试时会遇上哪些问题
  6. python 计时器模块_python中计时器
  7. 线性回归——加州房价预测
  8. 网站搭建之PHP安装教程
  9. 测试眼睛距离的手机软件,早教APP哪款护眼功能最完善?这几款可检测宝宝坐姿和观看距离...
  10. 3DLut表实现log视频的后期调色原理