unity3d 光照代码_unity3d光照 - CSDN
  • Unity3D,光照系统

    此系列博客是博主个人学习Unity3D的一些笔记,欢迎转载,如有错误,欢迎指出~~(基于unity3d 5.4.0f3)

    光照系统

    unity3D光照系统Lighting菜单中,一共有6个选项,分别为Directional Light(平行光),Point Light(点光源),Spotlight(聚光灯),Area Light(区域光),Reflection Probe(反射探头),Light Probe Group(光照探头组)Light菜单
    其中前四个为unity中的灯光,后两个会实现一些特殊的效果,后边会讲到。

    Directional Light(平行光)

    平行光是unity中最常见的一种灯光,其原理与太阳光近似,不受position与scale的影响,Rotation会影响到光线照射的方向。下图显示出了平行光的照射方向。平行光
    除了transform组件,所有的Light还有Light组件Light组件
    Type(种类):在此项中可以对灯光的种类进行设置,方便快捷,如果建立灯光出错,可以在这里进行修改。

    Baking(烘焙模式):有Realtime(实时烘焙),Baked(仅对静态物体烘焙),Mixed(对静态非静态物体都进行烘焙)。
    Color(颜色):选择灯光的颜色,包含RGBA四种属性,后边的小笔
    可以进行取色。

    Intensity(强度):光照的强度,数值在0~8之间。
    Bounce Intensity(反射光强度):光照射到物体上反射出去的强度,数值在0~8之间。

    Shadow Type(阴影种类):包含三个选项,分别是No Shadow(无阴影),Hard Shadow(低质量阴影),Soft Shadow(高质量阴影)。Hard Shadow和No Shadow对性能消耗的比较小。选择伊宁之后,会出现新的小菜单。Strength代表阴影的强度,数值在0~1之间,1时阴影最明显,0时无阴影。Resolution代表阴影的分辨率,Use Quality Setting表示在游戏开始时根据玩家的选择来设置阴影质量,其他四个依次代表从低分辨率到高分辨率。剩余的三个属性我目前也不知道什么意思,具体的作用是什么,如果有哪位大神指导,请指教~

    Cookie(具体不知道该咋翻译,总不能翻译成蛋糕吧,手动滑稽~):通过设置具有Alpha通道的图片,使阴影出现相对应的图案。
    Cookie

    Draw Halo(光晕):勾选之后,灯光周围会出现一圈光晕。
    美丽的光晕

    Flare(耀斑):按照Asset→Import Package→Effect依次导入,再点击Flare后的小圆圈,会有三个选项出现,这三个选项都比较接近真实的物理光照,达到逼真的效果。这里要注意,Directional Light的Flare设置,是对天空盒上的太阳进行修改,其他三个Light则是对场景中的灯光组件进行更改
    这里写图片描述
    Render Mode:这个我暂时也不知道,哭脸~~

    Culling Mask(剔除遮罩):通过设置物体的Layer层,使得该层的物体接受(或不接受光照)。
    这里写图片描述
    这里在红色箭头指示的位置添加了No Light层,并将场景中球的Layer设置为No Light。在Directional Light的Culling Mask中,把No Light勾选掉,场景中的小球就不再接受光照。

    Point Light(点光源)

    点光源顾名思义,就是从一个点向四周发散光线,和蜡烛的光线类似。点光源
    其Light组件与Directional Light基本相同,用法也基本相同,不同之处在于,点光源多了一个Range(范围),在图中可以清楚地看到由线条组成的一个圆,即点光源的范围。

    Spotlight(聚光灯)

    聚光灯是由一个点沿一个方向发射的束状光线,与生活中的手电筒类似。其Light组件与Directional Light基本相同,不同在与,他多了Range,与Spot Angle两个属性。Range代表照射光线的远近,Spot Angle代表照射的范围。
    这里写图片描述

    Area Light(区域光)

    区域光是这四种灯光中最奇特的一种,选择区域光之后,我们可以发现,在Type后,有Baked Only这个提示,这种灯光仅限于烘焙使用。它只能作用于静态物体,通过烘焙来生成光照贴图,从而极大的减少了性能的开销。这里的Plane设置成了静态
    区域光没有阴影选项
    区域光没有阴影选项,且极大的节省的性能的消耗,一般可以用在房屋壁灯或者显示器等光照效果中。


    反射探头(Reflection Probe)在后边的材质(Material)中会讲到,光照探头(Light Probe Group)我会放在下一篇讲。

    以上属个人见解,如有错误,请指出,会及时修改,如果有大神能帮忙补充,感激不尽!!

    展开全文
  • Unity3D 光照数据简介

    2018-09-06 15:15:13
    之前一直对光照部分不清不楚很多地方也没有研究,恰逢遇到一本...我个人认为Unity3d 光照处理流程分为三步,1.决定调用什么Pass,2.为Pass准备合适的光照数据,3.在Pass中进行对应的光照计算。这三步其实就是我们的...

    之前一直对光照部分不清不楚很多地方也没有研究,恰逢遇到一本《 UNITY 3D SHADELAB实战详解》里面详细的讲解了部分Shader段,有关光照的的详细内容,但是依然不全,于是硬着头皮啃了一部分,这里把一些心得写下防止忘记了。

    我个人认为Unity3d 光照处理流程分为三步,1.决定调用什么Pass,2.为Pass准备合适的光照数据,3.在Pass中进行对应的光照计算。这三步其实就是我们的渲染流程,毕竟渲染的主要目的之一就是要处理光嘛,没有光什么都看不见了。其中1,2这两步决定了最后Pass中可以用到什么样的光照数据,所以我先将自己理解的这两部的处理机制写下来,以后搞懂了全部的流程再补充一个完整的博客。

    1.决定渲染什么物体以及调用什么Pass

         首先,对于物体的渲染工作(将顶点和纹理通过算法计算成屏幕像素),都是显卡执行Pass代码完成的,Shader只不过是对Pass的一个包装,具体的渲染代码是Pass,Pass之外的设置只是告诉Unity引擎,可以用哪些 Pass ,怎么用这些 Pass ,如何配置和设置Pass的执行过程。所以当需要渲染时,首先要做的就是找到要渲染的物体和要用来渲染它的Pass 。流程如下、

    1.找到相机视域中的一个物体

    2.检查物体的材质

    3.找到材质绑定的Shader

    4.打开Shader找到可以在当前硬件条件下使用的第一个SubShader

    5.查看SubShader中的Pass

    6.对比Pass 的 LightMode 是否和相机的 RenderPath 是对应的,如果是完全对应或则对应到比相机 RenderPath底一级的渲染路径则渲染,否则不渲染。

    Camera RenderPath(渲染路径) 与 Pass LightMode (光照模型) 对应关系为

    Legacy Vertex 顶点渲染路径=> Vertex 顶点光照

    Forward 前向渲染路径  => ForwardBase, 前向基础光照  ForwardAdd 前向附加光照

    Defeered 延迟渲染路径 => Defeered 延迟光照

    渲染路径的高低顺序分别是

    Defeered 延迟渲染路径 》 Forward 前向渲染路径 》 Legacy Vertex 顶点渲染路径

    2.为Pass准备合适的光照数据

    决定了渲染的物体和要调用的Pass后,现在就要为Pass准备合适的光照数据了,准备光照数据也要遵循很多规则,那么我这里按照Pass的不同分开讲述规则。

    PASS LightMode=Vertex 顶点光照模型

    _WorldSpaceLightPos0

    _LightColor0

    unity_4LightPos[XYZ]0

    unity_4LightAtten0

    以上都无光照数据

    unity_LightPosition[8]

    unity_LightColor[8]

    unity_LightAtten[8]

    已上三项根据如下原则按先后顺序设置光源数据

    1.Light.RenderMode =Importent (重要) 优先

         1.平行光优先

         2.亮度优先

         3.距离优先

    2.Light.RenderMode =Auto (自动) 优先

         1.平行光优先

         2.亮度优先

         3.距离优先

    3.Light.RenderMode =Not Importent (不重要) 优先

         1.平行光优先

         2.亮度优先

         3.距离优先

    PASS LightMode=ForwardBase 前向渲染基础光照模型

    _WorldSpaceLightPos0

    _LightColor0

    已上两项按如下规则,设置为排序第一的光源数据

    1.必须是,平行光

    2.必须是,Light.RenderMode =Importent 或则 Light.RenderMode =Auto

    3.亮度优先

    4.距离优先

    unity_LightPosition[8]

    unity_LightAtten[8]

    已上两项无数据

    当SubShader 同时包含 LightMode=ForwardAdd 的 Pass 时数据如下

    unity_4LightPos[XYZ]0

    unity_4LightAtten0

    unity_LightColor[8] 

    已上三项按照如下规则,排序并设置数据

    1.必须是,非平行光

    2.必须是, Light.RenderMode =Not Importent

    3.亮度优先

    4.距离优先

    当SubShader 不同时包含 LightMode=ForwardAdd 的 Pass 时数据如下

    unity_4LightPos[XYZ]0

    unity_4LightAtten0

    unity_LightColor[8] 

    已上三项按照如下规则,排序并设置数据

    1.必须是,非平行光光源

    1.Light.RenderMode =Importent (重要)

         1.亮度优先

         2.距离优先

    2.Light.RenderMode =Auto (自动)

         1.亮度优先

         2.距离优先

    3.Light.RenderMode =Not Importent (不重要)

         1.亮度优先

         2.距离优先

    PASS LightMode=ForwardAdd 前向渲染附加光照模型

    这个pass 将会在ForwardBase Pass调用后调用,并根据光源情况按照如下条件和排序规则,按顺序多次进行调用

    1.必须是,未在 LightMode=ForwardBase  的 Pass 中设置到_WorldSpaceLightPos0 的光源(因为已经在ForwardBase Pass处理过了)

    2.必须是,Light.RenderMode =Importent 或则 Light.RenderMode =Auto 的光源

    3.RenderMode =Importent 优先

          1.平行光优先

          2.亮度优先

          3.距离优先

    4.RenderMode =Auto 优先

          1.平行光优先

          2.亮度优先

          3.距离优先

    _WorldSpaceLightPos0

    _LightColor0

    已上两项光源数据即是当前需要进行附加渲染的光源数据。

    unity_4LightPos[XYZ]0

    unity_4LightAtten0

    unity_LightColor[8] 

    unity_LightPosition[8]

    unity_LightAtten[8]

    已上五项无数据

     

    ​​​​​​​目前就整理这么多,以后再续增加

    展开全文
  • 一个最常见的的光照模型例子 #pragma surface surf BasicDiffuse inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten){ float difLight = max(0, dot (s.Normal, lightDir)); ...

    一个最常见的的光照模型例子

    #pragma surface surf BasicDiffuse
    
    inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten){
        float difLight = max(0, dot (s.Normal, lightDir));
        float4 col;
        col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
        col.a = s.Alpha;
        return col;
    }

    1.在#pragma surface surf 光照模型名称

    2.光照模型函数命名规则是“Lighting”+“自定义的光照名称”。

    3.光照模型的5个原型

    half4 LightingName (SurfaceOutput s, fixed3 lightDir, half atten);
    half4 LightingName (SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, half atten);
    half4 LightingName_PrePass (SurfaceOutput s, half4 light);
    half4 LightingName_DirLightmap(SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
    half4 LightingName_DirLightmap(SurfaceOutput s, fixed4 color, fixed4 scale, fixed3 viewDir, bool surfFuncWritesNormal,out half3 specColor);

    4.第一种原型。第一个参数是输出结构,第二个参数是光线方向,也就是光源到物体表面上的点的向量,是单位向量,第三个参数衰减度,attenuation的缩写,因为光线被物体反射之后,会有能量损失,所以会有衰减。_LightColor0也是Unity内置的一个变量,它在不同的render path和pass里的意义不同,在这里就是平行光的颜色。

    展开全文
  • 谈一下unity3d光照

    2015-12-09 11:30:37
    其实学习shader的话,搞unity开发,就是《unity 3d shaderLab开发实战详解》。unity在opengl的基础上又封装了了一个表面着色器,本id其实并不怎么喜欢写表面着色器,因为以前学习opengl的时候都没有听说过这个东西,...

    其实学习shader的话,搞unity开发,就是《unity 3d shaderLab开发实战详解》。unity在opengl的基础上又封装了了一个表面着色器,本id其实并不怎么喜欢写表面着色器,因为以前学习opengl的时候都没有听说过这个东西,其实表面着色器最终是要编译成顶点和片元着色器的。

    今天本id突然想说起这个,是因为昨天下午被自己坑了一把,就导致了在unity编辑器上运行正常,手机上却看不到效果。就是对于点光源的光照计算,当然如果是平行光就不会出现这种情况,unity对于点光源的计算在《unity 3d shaderLab开发实战详解》这本书上也是有介绍的,这是原文:

    VcHexL⒒渲染模式下,FomardBasc和
    FowardAdd的 ughtM。 de都 不被支持。 另外,FwdAddX.shadcr在 3个 渲染路径下都没有输出,这
    说明 FoⅢ ardAdd这个 Pass需 要和 FomardBasc— 起使用,否 则会被Unity所忽视掉。 在 Fomard
    Dcfcrred渲 染路径下,Fomard的 Pass均 能被正常渲染。


    下面是关于光照的shader:

    Shader "Custom/LightAndOutline" {
    	Properties {
    		_Color ("Main Color", Color) = (1,1,1,1)
    		_OutlineColor ("Outline Color", Color) = (1,1,1,1)
    		_Outline ("Outline width", Range (0.0, 0.03)) = .005
    		_MainTex ("Base (RGB)", 2D) = "white" { }
    		_BumpMap ("Bumpmap", 2D) = "bump" {}
    	}
     
    	
     
    	SubShader {
    		//Tags { "Queue" = "Transparent" }
     
    		// 描边通道
    		/*Pass {
    			CGINCLUDE
    			#include "UnityCG.cginc"
    			 
    			struct appdata {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    			};
    			struct v2f {
    				float4 pos : POSITION;
    				float4 color : COLOR;
    			};
    			 
    			uniform float _Outline;
    			uniform float4 _OutlineColor;
    			ENDCG
    			Name "OUTLINE"
    			Tags { "LightMode" = "Always" }
    			Cull Back
    			ZWrite Off
    			ZTest Less
    			//Blend Off
    			// you can choose what kind of blending mode you want for the outline
    			Blend SrcAlpha OneMinusSrcAlpha // Normal
    			//Blend One One // Additive
    			//Blend One OneMinusDstColor // Soft Additive
    			//Blend DstColor Zero // Multiplicative
    			//Blend DstColor SrcColor // 2x Multiplicative
    
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			 v2f vert(appdata v) {
    				// just make a copy of incoming vertex data but scaled according to normal direction
    				v2f o;
    				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    			 
    				float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
    				float2 offset = TransformViewToProjection(norm.xy);
    			 
    				o.pos.xy += offset * o.pos.z * _Outline;
    				o.color = _OutlineColor;
    				return o;
    			}
    			half4 frag(v2f i) : COLOR {
    				return i.color;
    			}
    			ENDCG
    		}*/
    		
    		Pass {  
    			Tags{ "LightMode"="ForwardBase"}
    			Cull Off
    			Blend SrcAlpha OneMinusSrcAlpha 
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "UnityCG.cginc"
    			#include "Lighting.cginc"
    			struct appdata_t {
    				float4 vertex : POSITION;
    				float2 texcoord : TEXCOORD0;
    			};
    			struct v2f_t {
    				float4 vertex : SV_POSITION;
    				half2 texcoord : TEXCOORD0;
    			};
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			v2f_t vert (appdata_t v)
    			{
    				v2f_t o;
    				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
    				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
    				return o;
    			}
    			fixed4 frag (v2f_t i) : SV_Target
    			{
    				fixed4 col = tex2D(_MainTex, i.texcoord);
    				return col;
    			}
    			ENDCG
    		}
    		
    		
    		//光亮通道
    	Pass {  
    			Tags{ "LightMode"="ForwardAdd"}
    			Cull Off
    			Blend One Zero
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "UnityCG.cginc"
    			#include "Lighting.cginc"
    			struct appdata_t {
    				float4 vertex : POSITION;
    				float2 texcoord : TEXCOORD0;
    				float3 normal : NORMAL;
    			};
    			struct v2f_t {
    				float4 vertex : SV_POSITION;
    				half2 texcoord : TEXCOORD0;
    				float3 lightDir:TEXCOORD1;
    				float color : COLOR;
    			};
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			v2f_t vert (appdata_t v)
    			{
    				v2f_t o;
    				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
    				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
    				
    				
    				
    				float3 lightColor = _LightColor0.xyz;
    				o.lightDir = ObjSpaceLightDir(v.vertex);
    				float cos_a = saturate(dot(o.lightDir, v.normal));
    				cos_a = pow(lightColor*cos_a, 5);
    				o.color = cos_a + 0.9;
    				
    				
    				return o;
    			}
    			fixed4 frag (v2f_t i) : SV_Target
    			{
    				fixed4 col = tex2D(_MainTex, i.texcoord);
    				col.r = col.r*i.color;
    				col.g = col.g*i.color;
    				col.b = col.b*i.color;
    				return col;
    			}
    			ENDCG
    		}
     
    	}
     Fallback "Diffuse"
    }

    注意,这里的光照部分使用了两个通道,我们的光照计算主要在Tags{ "LightMode"="ForwardAdd"}这个通道中,书上说,要使得这个通道有效,必须有一个Tags{ "LightMode"="ForwardBase"}通道,所以在Add通道中需要使用Blend One Zero,把前一个通道隐藏起来。

    这里只是简单光照模型,见笑了

    展开全文
  • 传送门:Unity3D灯光与渲染学习之(一):天空盒、灯光以及色彩空间Unity3D灯光与渲染学习之(二):全局、烘焙以及混合光照Unity3D灯光与渲染学习之(三):探针使用、后处理与批处理4.全局和烘焙关照全局光照,...
  • 漫反射面:郎伯模型朗伯着色器(Lambertian shader)Toon shading镜面: Blinn-Phong模型在Unity5中物理渲染Unity 中使用的着色技术结论 为什么地球在两极严寒,而在赤道火热?这个问题,仿佛与着色器...
  • Unity3D-光照贴图技术

    2019-06-16 07:30:07
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Unity 5.6 光照烘焙系统介绍 李海辰发表于李海辰的专栏订阅 3K 腾讯云服务器 年付3折起 首次购买云服务器 最低3折起 超高性价比 限时抢购 在这篇文章中: 一、 基本概念 1. 直接光照、间接光照 2. 漫...
  • 它提供了3d游戏的大部分基础功能实现,比如物理碰撞、3d模型显示、光照等功能,简化了使用者开发游戏的过程,更能够节省非常多的成本,unity3d与别的游戏引擎最大的不同是,它的代码是跨平台的,也就是说,别的引擎...
  • unity3d代码设置环境光

    2017-10-10 14:04:12
    RenderSettings.ambientLight = new Color(r,g,b);
  •  为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...
  • 将需要烘焙的物体设置为静态,调整好太阳光方向,设置为Baked ,手动烘焙
  • 2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。...Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...
  • 实现这个功能,需要控制的元素有:天空盒、光照资源、环境光颜色。 本人环境:unity2018.1.f1 发布平台:pc (1)天空盒的替换,一行代码; RenderSettings.skybox = morningSky; //morningSky为自己的天空盒的...
  • Unity3D教程之Light光源

    2016-12-28 13:49:57
    Unity3D项目中,灯光摄像机都是一个游戏中十分重要的组件,下面我们就来谈谈Unity3D教程中的Light光源。如果大家对Unity3D感兴趣,就来菜鸟在线观看我们的Unity3D教程。  在Unity项目中,灯光和摄像机是非常...
  • Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?这介绍这些改进之前先放出...
  • 如题,项目中遇到这样一...我们知道Unity光照贴图是以scene为单位来设定的,制作一个光照贴图的流程大概是这样: 1.对需要使用光照贴图信息的资源勾选LightingMap Static标签 2.开启灯光 3.在菜单Window-&g...
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图
  • 一、探针基于球谐函数的全局光照 球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术。预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果。这种技术通过在运行前对场景中光线的相互作用进行预...
  • //创建一个名为"Player"的游戏物体 //并给他添加刚体和立方体碰撞器. player=new GameObject("Player"); player.AddComponent("Rigidbody"); player.AddComponent("BoxCollider"); //创建一个没有名称的游戏物体 ...
1 2 3 4 5 ... 20
收藏数 4,297
精华内容 1,718
关键字:

unity3d 光照代码