TeaPot 用webgl画茶壶(2) Phong Shading
2021-06-21 00:06
YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
标签:length rom identity 没有 ice from tco 大小 角度
在Fragment Shader里应用Phong Shading使得茶壶更逼真。即使是单一颜色的茶壶,只要光源的位置变化,或眼睛的位置变化,看到的茶壶的各个部分的颜色明暗是不一定一样的。所谓Phong Shading就是Phong这个人提出的一种决定每个像素颜色的方法。
总的来说,我们希望看到怎样的茶壶?我们希望它跟真的一样,有光照着它,所以照到的地方亮,照不到的地方暗,迎着光的地方还有高亮反射光。
点e看到点p有颜色,是因为有光子从p跑到了e。点p有光子,除非p是光源,不然光子肯定是从别的地方跑来。这个别的地方之一,就是光源,有光源照着p。但是,如果没有光源的直射,比如拉上窗帘的房间里,还是可以看到p,因为p点周围无数个点(茶壶上其它部分,杯子,桌子等等)都往它发射着光子。这是别的地方之二,环境。
总结一下一个点p(不是光源),被在e点看到了,说明
1. 有光子从别的地方跑到了p。
两个可能的来处,一是光源,一是环境。
2.p点的光子又跑到了e
到达p的光子有三个可能,一是被吸收产生热量,二是打入内部又散射出来,三是直接从表面反射出去。被吸收的就不用考虑了,剩下的一部分散射,一部分反射,散射是指这一部分光子从p出来后往各个方向跑(当然还是沿着直线),有一个方向指向e,e会看到散射光。散射光往往代表p本来的颜色,反射光与p本来的颜色几乎无关,因为它没有进入p内部而是在p处改变了方向,它还是原来的光。因为环境给p的光子是从各个方向来的,不好分析它们的反射方向,数量又不大,所以一般认为从环境里到达p的光子全都散射出去了。
环境里到达p的光子强度是固定的,而且它到达茶壶其它p1,p2等等的光子强度一样。而同一个光源,给茶壶各个p,p1,p2的光子强度却不是固定的。这个强度的大小与入射角度有关。Lambertian表示可以用 cos(p的法向量n与入射光的反方向向量l的夹角)*L的强度 来代表光源L到达p的强度,也就是n=normalize(n),l=normalize(l),dot(n,l)*L的强度。dot(n,l)可能小于0,小于0代表光是从p背面照着它,所以没有光子跑到p,max(0, dot(n,l))*L的强度。
光源的反射部分的方向是可以算出的,是向量r。e-p与r的夹角越小,说明接收的反射的越多。也可以看,向量h与n的夹角,h=normalize(e-p+l)。
p点的颜色=环境光的强度与颜色*散射系数+光源强度与颜色*max(0, dot(n,l))*散射系数+光源强度与颜色*pow(dot(h,n),P)
散射系数与p本身颜色紧密相关。pow是为了快速缩小高亮大小,否则高亮不真。P是光滑系数。
pow(dot(h,n),P)是改良的Phong shading。Phong提出的是pow(max(0,dot(r,e-p)),P)。区别是当e-p与r是钝角时,改良后的Phong Shading依然会产生反射光。光滑的表面放大后依然粗糙,有面向各个方向的Microfacets。
http://opengl.datenwolf.net/gltut/html/Illumination/Tutorial%2011.html
TeaPolt
TeaPot 用webgl画茶壶(2) Phong Shading
标签:length rom identity 没有 ice from tco 大小 角度
原文地址:http://www.cnblogs.com/javascript3d/p/7183588.html
文章标题:TeaPot 用webgl画茶壶(2) Phong Shading
文章链接:http://soscw.com/essay/96661.html