设为首页 - 加入收藏 - 网站地图月夜星空文库网文档在线分享!
当前位置:月夜星空文库 > 读书 > 正文

Sobol-Distributed Noise in Rendering

时间:2021-09-14 来源:eisar.com.cn 作者:月夜星空文库网

  1、单片机和电脑相连,要转几次?之前用stm开发板,里面有个max3232,作用是把单片机的电压转到电脑的电压,可是我看RS232的1 是+3~+15,TTL数电高电平>2.4就是1,这样的话他俩是重合的,为什么要转呢?

  答:电脑的UART接口(如果还有的话)是RS-232电平;单片机的TX/RX引脚是TTL/LVTTL/LVCOMS电平(根据不同的单片机而定)。这两个电平无法直接连接。

  比如RS-232一个高电平15V送到你单片机引脚,你能体会到单片机的感受吗?另一个方向上,芯片支持LVCOMS电平的引脚驱动能力很弱2mA,而设备间的电缆线很长,芯片LVCOMS引脚信号还没有到电缆另一端就消失啦。再说了,RS232的逻辑0是负电压,单片机既无法产生也无法消费。

  所以中间有一个芯片MAX232来实现相互转换。

  2、如果转了电平之后,为什么还要有一步 USB转串口 的操作呢,电脑有串口 也有USB,USB转串口不是必须的吧?

  答:其实现在电脑上基本看不到UART口了,替代的是USB口。记住USB接口支持的是USB协议,而UART口支持的是RS-232协议。两者不同,那只有转一下啦。

  3、两个芯片传数据,用的是RS232协议 还是 TTL协议啊,我查到单片机只有串口,那串口就是RS232了,但是用RS232还要转电平吗?

  答:PCB上两个芯片的UART连接,通常使用基带信号直连(只要电平规范相同就行)。用不上什么协议。

  你是概念没有搞清楚:串口、UART、RS232。有什么区别和联系,查一下。

  4、我看atmega16U2数据手册,上面写CMOS芯片,是不是他使用的天平就是CMOS电平啊?

  答:写COMS芯片一般指的是他用COMS工艺设计生产制造的。接口电平不一定是COMS电平。看手册就知道。

  现在一般是3.3V LVTTL/LVCOMS兼容的。甚至也支持5V接口。

  5、Arduino上atmega16U2 是USB转串口芯片,但是这上面又没有电平转换电路,他是怎么转的呢?

  答:芯片内部实现。

  6、TTL电平的电压上下限多少啊,是芯片的供电电源吗?CMOS的呢?

  答:这么具体的问题,问百度就知道了。TTL, COMS是电平规范,跟芯片供电电源没有半毛钱关系。

  7、芯片传数据要用RS232协议,但是RS232的电平高,芯片的电平一般也就是5V,他俩是怎么匹配的呢?

  答:有专门芯片处理。比如你提到的MAX232。你看看芯片数据手册就知道了。

  可以用折反射定律的矢量形式计算。

  光线在经过介质表面时,入射光线、反射光线、折射光线和表面法线总是处于同一平面的。在三维空间中考虑也总是可以通过入射光线和介质表面法线找到这样的一个平面,仍然可以归结为该平面内的二维参数的关系。所以在三维空间的折射和反射情况和二维的是一样的。不过二维平面坐标和三维空间坐标的换算比较麻烦,考虑使用折反射定律的矢量形式更加方便。

  折反射定律的矢量形式可以在二维的情况下推导出来,并推广到三维坐标系中使用。

  1. 折射定律的矢量形式

  折射定律矢量形式的推导

  考虑入射介质和出射介质折射率分别为 nn' ,入射角和折射率分别为 \	heta\	heta' ,根据折射定律就有

  nsin\	heta=n'sin\	heta'

  设入射光线的单位矢量为 \\vec{A} ,折射光线的单位矢量为 \\vec{B} ,界面法向单位矢量为 \\vec{N } ,则

  n\\left| \\vec{A}\\right|\\left| \\vec{N}\\right|sin\	heta=n'\\left| \\vec{B}\\right|\\left| \\vec{N}\\right|sin\	heta'=OD

  根据矢量叉乘的定义,结合各矢量共面的条件,有

  n\\vec{A}\	imes\\vec{N}=n'\\vec{B}\	imes\\vec{N}

  于是

  (n'\\vec{B}-n\\vec{A})\	imes\\vec{N}=0

  可知向量 n'\\vec{B}-n\\vec{A}\\vec{N} 平行,于是

  n'\\vec{B}-n\\vec{A}=\\Gamma\\vec{N}

  此时,只要求出标量 \\Gamma 的表达式就可以对任意的入射光求解出出射光线的矢量。

  \\Gamma=\\vec{N}\\cdot{n'}\\vec{B}-\\vec{N}\\cdot{n}\\vec{A}=n'cos\	heta'-ncos\	heta=\\sqrt{n'^{2}-n^{2}+(\\vec{N}\\cdot{n}\\vec{A})^{2}}-\\vec{N}\\cdot{n}\\vec{A}

  将其代入n'\\vec{B}=n\\vec{A}+\\Gamma\\vec{N} ,就可以求出折射光线的单位矢量。

  2. 反射定律的矢量形式

  反射定律的矢量形式推导

  对于反射光也是类似,可以认为出射介质的折射率 n'=-n ,相应的 \\vec{B}\	heta'=-\	heta )分别为反射光单位矢量和反射角。此时可以得到

  n\\vec{A}\	imes\\vec{N}=-n'\\vec{B}\	imes\\vec{N} (叉乘结果的模值为 OD=OE ,但方向相反,所以加了负号)

  (n'\\vec{B}+n\\vec{A})\	imes\\vec{N}=0

  类似地,有向量 n'\\vec{B}+n\\vec{A}\\vec{N} 平行。此时,

  \\Gamma=\\vec{N}\\cdot{n'\\vec{B}}+\\vec{N}\\cdot{n\\vec{A}}=-n'cos\	heta'+ncos\	heta=2ncos\	heta=2n\\vec{N}\\cdot\\vec{A} (注意 n'<0

  代入下式即可求出反射光矢量:

  n'\\vec{B}=-n\\vec{A}+\\Gamma\\vec{N}

  回到题主的提问本身,简单说就是利用最后这两个公式,将已知的入射光矢量、界面法线矢量和折射率代入即可求得反射光矢量。

  PS:最近因为对光线追迹的算法感兴趣,特别学习了一下折反射定律矢量形式。看到一些推导中反射定律是由折射定律直接推广得到的,其一般结论是 \\Gamma=-2n\\vec{N}\\cdot\\vec{A} , 仍有n'\\vec{B}=n\\vec{A}+\\Gamma\\vec{N} 。不过这样得到的 \\vec{B} 的方向似乎和反射光线传播方向恰好是反向的,当然这可能取决于对光线矢量方向的规定,也不影响使用。以上反射定律的部分则是我自己重新做了一下推导,符号略有不同,欢迎指正。

  小时候的我,身体虚弱,妈妈专门用一只小小的酱油碟子,每天蒸剁好的瘦肉末给我补充营养。而爸妈,永远吃的只是自家种的青菜。

  小时候的我,一听到村里哪口鱼塘要收成抽水捕鱼了。屁颠屁颠地提着一个小桶赶过去,因为,能摸到石螺和被塘主遗弃的小鱼毛细虾仔,饭桌上就能吃到妈妈炒石螺和香煎小鱼虾了。

  小时候的我,爬遍了村里的每一棵番石榴树和龙眼树。番石榴哪棵白馕,哪棵红馕,哪棵爽口,哪棵绵甜,门道摸得贼精;龙眼哪棵核大,哪棵核小,哪棵寡淡无味,哪棵清甜多汁,烂熟于心。这个天然水果自助乐园,对于儿时的我,真是天堂!

  小时候的我,可以蹲在村里唯一一间炼油厂旁边,等同村的那位炼油大哥熬完猪油后剩下的油渣送给我们吃。你别说,加一点豆瓣酱,搁饭锅里蒸,香味四溢,味道真的很正!

  小时候的我,看到别人吃砵仔糕,馋得不得了。于是,回家用妈妈烧菜用的生粉搅拌成糊,倒在那只小小酱油的碟里,搁饭锅里蒸。饭熟了,拿出来,哇!那爽口弹牙的口感,永远忘不了!

  小时候的我,坐在灶台前看柴火,锅里咕噜咕噜熬着白米粥。爸爸提着自制的铁叉,到自家种的霸王花地里捉青养(应该是田鸡),当爸爸提着两只“青养”回来,我拍掌大笑,因为,一顿鲜香美味的“青养”粥就要诞生了!

  小时候的我,帮着妈妈把收割回来的韭菜倒饬了一整天,当妈妈把从菜贩手中收到菜钱后,给了我五毛钱奖励。我从村口小卖部买了一块马仔糕。轻轻的闻着,细细地咬着,好开心呀!

  一转身,看到了妈妈笑眯眯看着我,我问:“妈妈,您也尝尝吧!”

  妈妈浅浅的咬了一小口。我看到她的眼睛红了。

  小时候的我,跟着爸妈去收稻谷。稻谷地离村子相隔一条河。水并不深。可以看到河底的沙石。我坐在那条水泥船上,爸爸划着竹篙,水面泛起道道水痕。

  突然,一尾鱼跃出水面。我欢喜地大叫一声。爸爸眼睛里放着光。把竹篙插进淤泥里,下船捕鱼。

  那是一尾浑圆硕大的鲤鱼。忘不了,那一张一噏的嘴巴,那不断甩动的尾巴,还有在阳光下闪闪发光的鱼鳞。

  那晚,饭桌上摆放了一道姜葱红烧鲤鱼,那鲤鱼籽满满一碗,蒸得黄澄澄的。连空气里都弥漫着香味。欢声笑语充满了小屋。

  原来,留在记忆中的,一直都与吃有关。也许,食物,本身就是生活的本味。

  一直都知道,我家的确很穷很穷,但我知道,只要和家人在一起,再苦也是甜的。

  亲情环抱的日子,充实而温馨。父母的爱,让那小小的我拥有了傲视全世界的幸福!

  致我们逝去的童年,及老去的双亲。

  “赠人玫瑰,手有余香”。喜欢的话,可以赠予给猫猫一个赞吗?充满善意的小小举动,足以温暖人心。

  这其中的利益矛盾纠葛我倒是完全不懂。

  不过我倒是想谈谈当事人本人即那位ywwuyi,我与他大概并无任何瓜葛交集,想来他也没拿过我做过法,所以我对他并没有什么厌恶或者仇恨的态度,纯粹作为一个中立的观察者的视角谈谈我对他的一些想法。

  我觉得吧,他大概觉得这种被万人围绕当做人上人一般吹捧是一种很开心的事情,所谓的辱爽,无非不过就是当年议事厅那些找“哈娜桑”轨道炮自己并以此为荣的翻版,在那样的群体狂欢中,双方都得到了满足。 然而想来ywwuyi好歹注册时间也是08年,哈娜风光了几年最后是个什么下场想必大概也是看到的。

  一个人受到多少批评和诋毁自然让人不开心,但这并不算什么可怕的事情,可怕的是迷失在吹捧之中,软刀子一样可以杀人的,怂恿毛人风的风哥你先拿未必就是安了什么好心,跑外网上称某某明星被政府打压的粉丝只怕是觉得正主他死得不够惨。

  这种被吹捧还安然受之的甚至都是最低级的一种, 大概就是星宿派门人吹捧丁春秋,而丁春秋还乐呵呵的一样, 高级一点的洪教主都且知道“仙福永享寿与天齐”是马屁,当不得真,石碑的蝌蚪文是陆高轩文章做得好,该杀的时候也就杀了,才不会怜惜。

  人在风光,握有权柄的时候,少有的会去想失去风光,失却权柄的下场,再被吹捧几句更加的飘飘然,总觉得自己德配天地了。 但世间万物终究没有什么是永恒的,人会老,会变丑,会爬不动楼,自然权柄也会失去,风光也会失去,爬得多高的人摔下来就有多惨,NGA的企鹅熊猫哈娜猴子再到后面的厨子食堂巨魔杀日之流,哪个又不是如此呢,喜欢玩五学的这些人,总还记得那句政治是面对现实的学问的台词罢?

  

  我觉得很正常。

  首先这个题就已经难的离谱了,你要知道辩论的这些都是什么人,这群人八成没有一个人的精神需求跟偶像能沾边。他们的人生中扮演偶像的角色很可能是自己,现在让他们争论拿其他人做偶像来满足精神需求,这怎么理中客得起来?

  我是一个asoul粉,现在我要讨论一下肖战还是holo更能满足当代人的精神需求?当代人有没有毛病我不知道,但你能不能给点钱让我昧一下良心?

  知识的诅咒多简单的道理,我从3月看asoul到今天,单直播都得150h了,更不用说什么切片小短文短视频,那我是知道选手哪说的都不对。选手如何保证资料的准确性?如何反驳资料对准确性?互相找找逻辑漏洞就不错了,别指望能有什么精彩的表现,那是建立在双方都了解的程度上才能进行的。

  所以当你看到一些明显有问题的论据、观点、评价,互相摆烂扯皮不知所云,你就直接当选手们在求救就行了,人家在说:大哥我特喵的也没搞懂这是啥,但我想赢啊。

  

  公司有一名同事莫名眩晕,呕吐,还叫了911救护车,检查之后是眩晕症(Vertigo)。我最近也有点莫名头晕,于是在网上查询了一些资料,正好看到这一篇文章:他的“弱智发明”解救患者无数,却遭同行排挤、诅咒,甚至被告上法庭

  然后我想这么简单的原理,一定有更简单有效的方法自我治疗吧。一查,还真的有:科罗拉多大学医院的平衡实验室主任Carol A. Foster,2013年的一天,早晨醒来感觉天旋地转,发现自己居然得了每天都在治疗的病症:Vertigo。自己就是这方面的专家,怎么能麻烦别人来治疗我呢,于是捣鼓出一套简单的方法,分分钟自己治愈。

  然后她搞了一个网站,几个视频,教大家怎么简单治愈眩晕症,四年来youtube上面几百万的点击量,大家都反映比传统的治疗手法还有效。我查了一下,没有在国内找到相应的信息,所以在这里分享给大家,希望对得了眩晕症的朋友有所帮助。

  医生的网站:Half Somersault Or Foster Maneuver

  这里是翻译过的治疗方法:

  注意:每个动作之间,应该间隔大约30秒,少数患者需要做3到4次才能消除症状,每套动作之间需要间隔15分钟。

  

  这是Carol A. Foster医生的视频:

   https://www.zhihu.com/video/923220520063881216

  这是另外一个医生Dr. Ludlow的治疗展示视频,做的比较清晰,所以传上来给大家参考。

   https://www.zhihu.com/video/923219831371730944

  希望这对大家有帮助:)

  PS. 根据大家经常问的问题,在这里注明一下:左侧和右侧的问题,如果你无法判断是哪侧耳石脱落,可以两边都做,没有害处。

  如果无效或者效果不明显,可以15分钟之后再做,整套动作可以做多次,没有害处。

  在实时渲染中我们经常需要使用很低的采样来实现一个看起来还算可以的效果,这种情况下就会需要用到随机算法,随机的偏移或抖动,配上Temporal Filter融合多帧结果可以达到这个目标,然而并不是随便用一个随机就可以的,事实上先前本人也在很长一段时间采用暴力的伪随机算法,导致噪点的跳动十分嚣张,近来意外看到一系列Sobol低差异分布随机算法,并且也几乎没有看到低差异随机分布在实时渲染中的应用的文章,因此决定单独开一篇文记录一下。

  与离线渲染保持镜头不动渲染静帧的不同的是,实时渲染中说的“低差异”不止“空间”这个维度,还有另一个“时间”维度,通俗的讲就是如何让多帧的噪波分布均匀,使其在高速的帧率下保证稳定性,而同时满足两个维度的低差异的算法,往往都有相当恐怖的耗时,若全屏幕每个像素都计算一遍可能需要在并不太高端的显卡上消耗数毫秒,这显然是不能够被使用的。那既然鱼与熊掌不可兼得,我们就只能想办法融合多种方法,实现一个能够说得过去的工程解。

  首先这里用到的第一个算法是Sobol:

  Sobol sequence generator

  这个算法是消耗高且效果好的算法,我们决定在CPU端运行这个算法,算出几个固定的Sequence以后传入GPU,在GPU中通过像素当前的坐标作为随机种子计算一个廉价的哈希,使每个像素拥有一个固定的随机偏移,这就算实现了一个高性能的时间维度的随机,对于需要多重采样的诸如Shadowmap,AO,SSR等效果,这个办法非常的好用。多重采样的算法往往因为采样覆盖率比较高,对空间维度并不那么看重,较高的信息密度使得空间偏移上的分布变得不那么重要,然而对于时间维度却极为看重,对Temporal Filter不友好的噪点会使得闪烁十分剧烈。

  首先是固定偏移的生成算法:

  inline uint3 hash_int( uint3 x )

  {

  const uint k = 1103515245;

  x = ((x>>8)^x.yzx)*k;

  x = ((x>>8)^x.yzx)*k;

  x = ((x>>8)^x.yzx)*k;

  return (x);

  }

  inline uint4 hash_int( uint4 x )

  {

  const uint k = 1103515245;

  x = ((x>>8)^x.yzwx)*k;

  x = ((x>>8)^x.yzwx)*k;

  x = ((x>>8)^x.yzwx)*k;

  return (x);

  }

  inline uint2 hash_int( uint2 x )

  {

  const uint k = 1103515245;

  x = ((x>>8)^x.yx)*k;

  x = ((x>>8)^x.yx)*k;

  x = ((x>>8)^x.yx)*k;

  return (x);

  }

  传入CPU计算好的sobol sequence,直接累计偏移:

  inline float4 GetSobolNumber(float4 sobol, const float4 rng) {

  uint4 tmp_rng = hash_int(asuint(rng));

  float4 shift = tmp_rng * (1.0 / (float)0xFFFFFFFF);

  return frac(sobol + shift);

  }

  通过这种方法实现的Shadowmap,仅使用6次采样就能达到十分完美的效果(两个影子分别来自Cascade Shadowmap和一盏Spot Light):

  6SPP Temporal Filter Off6SPP Temporal Filter On

  可以看到,在对噪点要求最为苛刻的纯白色材质上,也能达到稳定的效果,如果说6次采样对于某些低端显卡难以承受,那么我们再测试一下折半后的3次采样配合Temporal Filter达到的效果:

  3SPP Temporal Filter On

  可以看到,虽然噪点显著增多,但实际分布还是非常均匀,在游戏中对观感的影响也很低,3次采样的软阴影甚至在爪机端都能跑,这是Sobol算法的应用带来的优越性。

  对于那些并不能够多次采样的应用场景,就要以空间维度为主进行考虑,这里拿出Eric的Sobol02实现:

  Sobol02:

  Sobol02 Noise, Temporal Filter OffSobol02 Noise, Temporal Filter On

  奆佬的网站,贴心的奆佬还提供了示例代码,不过代码中有一点小Bug,Dimension虽然最大限制在255,但是超过7就会直接越界,所以实际可用的Dimension只有8位:

  https://eheitzresearch.wordpress.com/762-2/

  单从噪点分布可以看出,使用Temporal Filter混合后的Sobol02分布极为均匀,这里每个Kernel最大支持128x128,所以我们可以在GPU端计算一张128x128的贴图,刚刚说到,这套算法被用来作为空间维度伪随机的主战场,帮助单次采样的应用场景,因此我们就放弃掉多次spp的,携带rankingTile数组的kernel,只使用scrambling达到每帧独立的随机分布,这是Compute Shader的代码,输出一张R10G10B10A2_UNORM的结果:

  StructuredBuffer sobol_256spp_256d : register(t0);

  StructuredBuffer scrambling : register(t1);

  RWTexture2D _MainTex : register(u0);

  cbuffer Params : register(b0){

  float3 _RandomSeed;

  uint _FrameIndex;

  }

  float3 GetSobol(uint2 pixel, uint sampleIndex, uint3 sampleDimension)

  {

  // wrap arguments

  uint3 samplePos = sampleDimension + (pixel.x + pixel.y*128)*8;

  // xor index based on optimized ranking

  uint3 rankedSampleIndex = sampleIndex;

  uint3 dimSamplePos = sampleDimension + rankedSampleIndex * 256;

  // fetch value in sequence

  uint3 value = uint3(

  sobol_256spp_256d[dimSamplePos.x],

  sobol_256spp_256d[dimSamplePos.y],

  sobol_256spp_256d[dimSamplePos.z]);

  value = value ^ uint3(

  scrambling[samplePos.x],

  scrambling[samplePos.y],

  scrambling[samplePos.z]);

  // convert to float and return

  float3 v = (_RandomSeed + (float)value)/256.0;

  return v;

  }

  [numthreads(8,8,1)]

  void SampleSobol(uint2 id : SV_DISPATCHTHREADID){

  _MainTex[id] = GetSobol(id, _FrameIndex, uint3(0,1,2));

  }

  算法短小精悍,而且只输出一张128*128的图片就足够使用,之所以是float3而不是float4主要是因为目前也没有发现必须要4个通道的随机场景,所以直接干掉A通道将其余通道缩到10bit节省一半带宽,我们在渲染管线中开出两张同样大小的128x128的RT进行Swap,这样这个运算过程就可以被async compute轻易掩盖,对于主机而言十分友好。

  这张随机图首先被用在了Froxel的屏幕空间采样上,先前文章中提到过,Froxel分辨率极低,一张160 * 90 * 128的超低分辨率3D贴图覆盖住视锥体,硕大的体素块破坏画面体验,使用Bokeh算子多次采样体素贴图实现模糊效果可以解决这个问题,然而众所周知,采样3D贴图需要Quadlinear,带宽消耗极高,多次采样不能被允许,因此在采样Froxel时于屏幕空间执行一个Sobol02就能很好的解决这个问题:

  Sobol02 Jitter, Temporal Filter OffSobol02 Jitter, Temporal Filter On

  在Temporal Filter的帮助下,虽然噪点依然存在(毕竟只有1次采样),但是噪点的分布并不凌厉,相反十分柔和,正是因为算法的应用,使得廉价的屏幕空间模糊采样成为了现实。

相关文库:白鹿洞(113)江南行(99)息夫人(128)七言诗(86)

(月夜星空文库:admin)

(0)
0%
(0)
0%
上一篇:小喇叭传真情 办实事暖民心
下一篇:没有了