color-bleeding map ( 颜色扩散贴图/辉映贴图 )

 

Half-Life 2 在Quake2的Lightmap 技术基础上结合了Normap,成为Normapped Radiosity Lighting,也有叫做Bumpped Radiosity Lightmap;

Half-Life 2 将Q2的光照技术发挥到了极致,然而还是不能动起来...

 

我尝试着用Radiosity 实现了Lightmap(没有Normap),并且竭力想让静态的Lightmap 和实时的Shadow mapping 融合起来;经过一系列的研究和尝试,初步实现了这一结果。

 

 

 

上图中红色的光源是动态光源,采用了Shadowmapping + Project Spot Texture 是聚光灯效果;白色的光源是静态光,用来预先计算Lightmap;运行时在Fragment Shader中将Lightmap 采样颜色和Shadow mapping /Pixel Lighting 颜色相加作为光照颜色,再和基本的Color 或者Texture 相乘;

多个实时光源简单的采用多遍渲染到纹理,然后在屏幕空间相加混合的方法融合在一起;最后再在屏幕空间和渲染场景(将实时地Shadow map 投影在屏幕上),与Lightmap纹理相加混合;然后不幸的事情是实时实时地阴影无法在光照图上变暗,因为阴影和Lightmap相加无法使其变暗;用阴影反相相减的方法,也许能够解决这个问题,但是现在我还没有找到完美的解决方案;不过在这里,这个问题不重要;因为我要重点介绍的东西,不是这个;

 

在竭力追求静态Lightmap 和 实时Shadow / Lighting 如何融合的问题上,为了让走进Lightmap的阴影的物体可以变暗,我曾想在输出lightmap的同时输出每个静态光源的Shadow Detph Map;因为Lightmap 是颜色图,已经不包含遮挡信息;必须使用附加的遮挡信息才能重建阴影信息;想来想去,觉得有点多此一举;

 

后来突发奇想,何不只要辐射度照明在光源对每像素光照之后的表面颜色扩散部分?

想法有了以后,立刻进行试验;于是我得到了标题所提到的“颜色扩散贴图”;那个时候我没有找到一个合适的名词来命名这个概念,我想把它叫做“环境辐射(Ambient Radiosity)”,但是总有沿袭 Ambient Occlusion 之嫌,所以并不满意;后来和skybreaker在交流Radiosity的时候,提到了我的想法;天才的skybreaker对这个增强部分称之为“color bleeding”;

 

skybreaker 是天才...

 

非常感谢skybreaker帮我想了一个准确的命名...我把这个增强的间接照明命名为“颜色扩散贴图(color-bleeding map)”,表示全局照明中,直接照明之后的间接照明部分。但是不能动的问题还是没有解决阿?呵呵,我们可以这样想:间接照明部分强调的是整体效果,而不是细节;所以动不动不重要;但是我把它和shadow map剥离以后,shadow map 就可以动了!进入阴影区的物体也会蒙上阴影;最后在把渲染好的color bleeding 屏幕纹理蒙上去。。。这样有了真实可信的间接照明(但是不能动);

 

虽然Crytek的ssao可是实时变化,而且效果还是令人满意的,但它只是遮挡的明暗信息,却没有表面对光的漫射信息;颜色扩散贴图可以解决这个问题。颜色扩散贴图不能动,但是不重要。

 

受ssao启发,我在想颜色扩散贴图是否也可以向ssao的方法一样把颜色扩散出去?但是仔细想过以后,发现没有这么简单;现在的实时辐射度不就是在做的这个么?即便有这种可能,对于屏幕每个象素要采集的影响因子恐怕不只是周围的几个像素了。我想过采集周围的三角面,只用顶点来color bleed,采用二次衰减以及N*L方法。。。

 

这个话题有点远了,不过我会尝试的。和大家分享一下我的渲染效果图吧,时间仓促,做的粗糙,请各位谅解 :)

 

 

 
< shadow map >
场景只有一个白色光源,红墙和绿墙遮挡出的阴影是纯黑色的,因为没有光源直接照射,没有环境光,也来自其他表面的间接照明,
他们各自的表面也只是光源直接照射,和材质共同决定了表面颜色,红色和绿色表面受白光照射,还是原来的红色和绿色。墙是蓝绿色,受白光直接照射,依然保持蓝绿色。
 

 

 

 
< color-bleed map >
表面颜色仅受来自于其他表面的间接光照对材质的影响,而不是直接光照对材质的影响;所以绿墙线面的地面受到来自于绿墙反射的绿光影响,变得微微发绿。红墙受到白光照射和周围的蓝绿色环境综合影响,变成了灰白色,所以对地面辐射微微的灰白色;如同他们自身的颜色扩散到了其他表面;中间两面墙上的颜色来自于周围的墙。

 

 

 

 

< shadow map + color-bleed map >

multi lights 叠加的 shadow map render texture和 color-bleed map render texture 在屏幕空间中投影,然后在fragmet shader中叠加,然后和其他颜色相乘的结果。可以看到在最终的合成结果中,叠加的见解照明部分是一种整体效果:全场加亮(阴影和光源照射区域都被加亮),明暗变化变缓,颜色扩散的亮区也变得比较不明显;即便静态的光源颜色和位置方向发生了变化,对间接照明部分的影响也不大,比如光源移动到了绿墙的左边,这个时候应该看起来绿色的亮区应该是在左侧,但是在整体氛围的烘托下,不是很重要。重要的是阴影自由了,可以和任何动态光源的阴影一样,叠加,以及把进入阴影的动态物体变暗,这个是非常明显而且重要的。另外红墙的颜色变成了灰色,看起来有点怪,其实没有问题,周围的蓝绿色和自身的红色叠加,以及白光的照射,得到的结果就是趋近于灰白色。而绿光不同,绿光受到蓝绿环境(绿色为主)以及白光照射,还是保持绿色。

 

特别感谢引擎研发群里的各位朋友的支持,感谢零一等各位群友们的热情支持和关注,虽然小白总在“诋毁”我,但是可以看作一位诤友,没有严格的挑毛病,哪能不断地完善?小白也是天才。。。大家都是天才,就我是个番薯,不过,事情还没有终结,还有更多的地方需要完善,我会不断努力的。。。

 

 

转载于:https://www.cnblogs.com/cgwolver/archive/2008/10/24/1318614.html

这段代码是 `jQuery.dropotron` 函数的主体部分,用于生成下拉菜单。 首先,通过 `jQuery.extend()` 方法将传入的 `options` 对象与默认设置进行合并,得到最终的 `settings` 对象,其中包含了菜单的各种设置,例如: - `selectorParent`:菜单的父级元素; - `baseZIndex`:菜单的基础 Z-Index 值; - `menuClass`:菜单的样式类; - `expandMode`:菜单的展开模式(鼠标悬停或点击); - `hoverDelay`:鼠标悬停延迟时间; - `hideDelay`:鼠标移开后菜单的隐藏时间; - `openerClass`:触发菜单展开的元素的样式类; - `openerActiveClass`:触发菜单展开的元素的激活状态样式类; - `submenuClassPrefix`:子菜单的样式类前缀; - `mode`:菜单展开的动画效果(即菜单的模式:直接显示、渐变、滑动或缩放); - `speed`:菜单展开的速度; - `easing`:菜单展开的缓动函数; - `alignment`:菜单的对齐方式; - `offsetX` 和 `offsetY`:子菜单的偏移量; - `globalOffsetY`:整个菜单的全局偏移量; - `IEOffsetX` 和 `IEOffsetY`:针对 IE 浏览器的偏移量; - `noOpenerFade`:如果为 true,当菜单展开时,顶级触发元素不会渐变; - `detach`:是否将二级菜单从父级菜单中分离(以防父级菜单的样式影响子菜单)。 然后,该函数会对菜单的每个子菜单进行遍历,设置其初始状态和绑定事件。具体实现过程较为复杂,包括以下几个主要步骤: - 为子菜单添加样式类; - 设置子菜单的位置; - 绑定鼠标悬停或点击事件,根据 `expandMode` 展开菜单; - 绑定菜单的隐藏事件。 最后,该函数返回菜单的 jQuery 对象,供调用者使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值