US3S6L1——阴影的基本原理
US3S6L1——阴影的基本原理 现实中阴影的产生规则 如图所示,现实中的阴影产生规则是,在不考虑光线反射的前提下 当一个光源发射的一条光线遇到一个不透明物体 A 时,这条光线就不能够再继续照亮其他物体了(物体B的一部分) 相当于光线被更靠近光源的A物体挡住了一些,这时物体A就会向旁边的物体B投射阴影 也就是说,阴影区域的产生就是因为光线无法到达 Shadow Mapping 技术 基于 阴影区域的产生就是因为光线无法到达 的这个规则 前辈 Lance Williams(兰斯·威廉姆斯)在 1978 年时最早提出了 Shadow Mapping (阴影贴图)技术。 这是计算机图形学中第一个提出的通用阴影算法。 Shadow Mapping 的基本原理:将摄像机的位置放在和光源重合的位置上,那么场景中关于这个光源的阴影区域就是摄像机看不到的位置 注意:一般情况下,点光源用透视投影,平行光用正交投影 Shadow Mapping (阴影贴图)技术在Unity中的本质其实就是...
US3S5L6——多种光源综合实现
US3S5L6——多种光源综合实现 知识回顾 前向渲染路径中如何处理光源 两个Pass Base Pass(基础渲染通道) Additional Pass(附加渲染通道) 在 Shader 当中如何判断多种光源 1234567891011#ifdef USING_DIRECTIONAL_LIGHT // 平行光逻辑#else #if defined(POINT) // 点光源逻辑 #elif defined(SPOT) // 聚光灯逻辑 #else // 其他逻辑 #endif#endif 点光源衰减值计算 12float3 lightCoord = mul(unity_WorldToLight, float4(worldPos, 1)).xyz; // 计算光源坐标fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).xx).UNITY_ATTEN_CHANNEL; //...
US3S5L5——聚光灯衰减计算
US3S5L5——聚光灯衰减计算 聚光灯默认Cookie 灯光组件中有一个 Cookie 参数,是用来关联光照遮罩图片的 对于平行光和点光源,默认是不会提供任何光照遮罩信息的 但是对于聚光灯来说,Unity 会默认为它提供一个 Cookie 光照遮罩,主要是用于模拟聚光灯的区域性 而此时 光照纹理中 _LightTexture0:存储的是 Cookie 纹理信息 _LightTextureB0:存储的是光照纹理信息,里面包含衰减值 因此 获取聚光灯衰减值时,需要从 _LightTextureB0 中进行采样 获取遮罩范围相关数据时,需要从 _LightTexture0 中进行采样 聚光灯衰减计算 将顶点从世界空间转换到光源空间 1float4 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1)); 注意:这里我们转换后和点光源不同的是,点光源只会获取其中的 xyz ,而聚光灯会获取其中的 xyzw 这是因为在聚光灯光源空间下的 w...
US3S5L4——点光源衰减计算
US3S5L4——点光源衰减计算 知识回顾 在Shader中进行光照衰减处理时,我们是通过从纹理中取出衰减数据 不使用灯光遮罩时,从 _LightTexture0 纹理中获取,使用时,从 _LightTextureB0 纹理中获取 在纹理采样之前,我们需要将顶点坐标从世界空间中转换到光源空间中,变换矩阵为: 老版本:_LightMatrix0 新版本:unity_WorldToLight 点光源衰减计算 注意:一般点光源我们不会为其添加 cookie 光照遮罩,一般想要使用光照遮罩都会在聚光灯中使用,因此我们不用考虑 cookie 纹理的问题 将顶点从世界空间转换到光源空间 1float3 lightCoord = mul(unity_WorldToLight, float4(worldPos, 1)).xyz; lightCoord 是光源坐标系下顶点根据光源的范围 range 规范化后的坐标,相当于是一个模长为 0~1 之间的向量 也就是说,无论点光源的范围多大,在光源坐标系下规范化后,范围都是 -1~1...
US3S5L3——光照衰减
US3S5L3——光照衰减 本章代码关键字 1234567_LightTexture0 //不使用灯光遮罩时,光照衰减数据的纹理_LightTextureB0 //使用灯光遮罩时,光照衰减数据的纹理_LightMatrix0 //旧版本的顶点坐标系转光源坐标系矩阵unity_WorldToLight //新版本的顶点坐标系转光源坐标系矩阵UNITY_ATTEN_CHANNEL //对光照衰减纹理使用tex2D得到颜色数据后,取出光照衰减值对应的分量的宏// 从光照衰减纹理内取出光照衰减值的写法,其中uv坐标由不同光源决定uv坐标如何计算tex2D(_LightTexture0,...
US3S5L2——在Shader中判断光源类型
US3S5L2——在Shader中判断光源类型 知识回顾 预处理指令:Shader中也存在预处理指令,它的使用和C#的预处理器指令类似 前向渲染路径在哪里进行光照计算 Base Pass(基础渲染通道):主要用于处理影响该物体的一个高质量光源(平行光)、所有中(逐顶点处理)低质量(SH处理)光源 等 Additional Pass(附加渲染通道):主要用于处理影响该物体的除平行光以外的其它高质量光源(每个高质量光源都会调用) 本章代码关键字 1234567891011121314// Unity 内置的判断光源的宏_DIRECTIONAL_LIGHT //平行光_POINT_LIGHT //点光源_SPOT_LIGHT //聚光灯// 使用宏定义进行条件编译#if defined()#elif defined()#else#endif// 更准确的判断光源类型的宏AutoLight.cginc ...
US3S5L1——多种光源
US3S5L1——多种光源 多种光源 Unity当中一共支持四种光源类型:平行光,点光源,聚光灯,面光源。其中面光源只在烘焙中使用,这里不讨论 Shader 开发中常用的光源属性:位置、方向、颜色、强度、衰减 对比平行光、点光源、聚光灯 平行光:没有位置、没有衰减、只有方向、颜色、强度参与计算 点光源:五个属性都需要考虑 聚光灯:五个属性都需要考虑,并且计算最复杂,因为它的范围很特殊,需要进行更复杂的计算 平行光 充当角色:太阳 照射范围:无限制 特点: 它不存在固定的位置 它的重要属性只有方向(可以通过 Transform 的 Rotation 属性来改变方向) 它到场景中所有点的方向都是一样的 由于它没有位置,因此它没有衰减的概念(光的强度不会随着距离而发生变化) 点光源 充当角色:灯泡、烛光 等 照射范围:有限 特点: 它的光是由一个点发出的,向四面八方延伸的光 它的范围由参数 Range 来决定 它的位置由 Transform 中的 Position...
US3S4L5——渲染路径对比
US3S4L5——渲染路径对比 渲染路径对比 在选择渲染路径时,我们应该根据项目的实际情况去进行考虑,比如: 针对的平台 场景的复杂度 等等 各渲染路径处理光照的区别 前向渲染路径: 有一套划分光源“三六九等”的规则,将光源分成了高中低三种身份,主要通过 光源渲染模式、项目质量设置中的像素灯光计数的数量、光照强度、距离物体距离来综合判定,然后分别使用三种方式进行光照计算 顶点照明渲染路径: 基本思想就是所有的光都按照逐顶点的方式进行计算的,在内置渲染管线中,它只会最多记录8个光源的数据,只会将光相关的数据填充到那些逐顶点相关的内置光源变量 延迟渲染路径: 先判断物体片元是否可见,然后将可见片元相关信息存储到 G 缓冲区中,通过 G 缓冲区的数据进行光照计算,对光照的数量没有任何限制,并且所有灯光都可以采用逐像素渲染,它不能处理半透明物体,并且不支持真正的抗锯齿 各渲染路径 Pass 处理的区别 前向渲染路径: Base Pass(基础渲染通道):主要用于处理影响该物体的一个高质量光源(平行光)、所有中(逐顶点处理)低质量(SH处理)光源...
US3S4L4——延迟渲染路径
US3S4L4——延迟渲染路径 延迟渲染路径 延迟渲染路径对光照的数量没有任何限制,并且所有灯光都可以采用逐像素渲染。 理论上来说,即使场景中有成百上千个实时灯光,依然可以保持比较流畅的渲染帧率。 它支持法线纹理、阴影等等效果的处理;但是它不能处理半透明物体,并且不支持真正的抗锯齿。 这些不支持的内容会自动使用前向渲染路径。 延迟渲染路径处理光照的方式 对光照的数量没有任何限制,并且所有灯光都可以采用逐像素渲染,它不能处理半透明物体,并且不支持真正的抗锯齿 延迟渲染路径在哪里进行光照计算 第一个Pass:主要判断哪些片元可见,并且将可见片元的相关信息存储到G缓冲区中(对于每个物体,该Pass只会执行一次,通常无需我们自己实现) 第二个Pass:利用G缓冲区中各个片元的相关信息进行真正的相关计算,最终将颜色写入颜色缓冲区 延迟渲染路径的内置光照变量 Unity会自动填充自定义变量 sampler2D...
US3S4L3——顶点照明渲染路径
US3S4L3——顶点照明渲染路径 顶点照明渲染路径 顶点照明渲染路径处理光照的方式 基本思想就是所有的光都按照逐顶点的方式进行计算的, 在内置渲染管线中,它只会最多记录8个光源的数据,只会将光相关的数据填充到那些逐顶点相关的内置光源变量 顶点照明渲染路径在哪里进行光照计算:在一个Pass当中按照逐顶点的方式一次性对所有光照去进行计算 顶点照明渲染路径的内置光照变量和函数 我们完全可以直接调用内置函数 ShadeVertexLights 或...