OpenGL超级宝典笔记——现实中的颜色与材料

<h3>现实中的颜色</h3> <p>以下图:咱们为物体构造好了模型,也为每一个平面设置了颜色值,但最终画出来的物体却一点都不像真实世界中的物体。在真实世界中物体的表面最终呈现的颜色还取决于你观察它的角度以及光源。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203355_RzUl.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203355_IqGZ.png" width="212" height="244"></a></p> <p>OpenGL提供了近似于真实世界的光照环境。在OpenGl中物体会被三种光照射:环境光,漫放射光,镜面光。经过调整这三种光源的属性,咱们可使得物体看起来更真实。</p> <h4>环境光</h4> <p>环境光没有特定的方向。环境光的光线充满着整个场景。场景中的物体都被环境光从各个方向照射着。环境光的特色是:照射在物体上的光来自周围各个方向,又均匀地向各个方向反射。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203355_RH7L.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203356_Qc4U.png" width="589" height="245"></a></p> <h4>漫反射光</h4> <p>漫放射光是一组来自特定方向,具备方向性的光。根据入射光线的角度在表面上均匀地向各个方向反射。漫反射的特色是:光源来自一个方向,反射光均匀地射向各个方向。漫反射光采用点光源照射物体。点光源是位于空间某个位置的一个点,向周围全部的方向上辐射等光强的光。在点光源的照射下,物体表面的不一样部分亮度不一样,亮度的大小依赖于它的朝向以及它与点光源之间的距离。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203356_09eI.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203356_oQLz.png" width="594" height="206"></a></p> <h4>镜面光</h4> <p>镜面光与漫反射光同样是具备方向性的。高强度的镜面光会在被照射的物体的表面上造成亮点。对于理想的高光泽度反射面,反射角等于入射角时,光线才会被反射,即只有在等于入射角的反射角方向上,观察者才能看到反射光。对于这种理想的反射面,镜面反射的光强要比环境光和漫反射的光强高出不少倍,这时,若是观察者正好处在P点的镜面反射方向上,就会看到一个比周围亮得多的高光点。</p> <p>&nbsp;</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203358_gsbO.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203358_UYeZ.png" width="580" height="261"></a></p> <h4>综合影响</h4> <p>事实上,光源是由各类强度不一样的类型的光组成的。场景中的光源是由3种光组成的:环境光,漫反射光,镜面光。每种光的成分也像颜色同样是由RGBA值定义的。它描述了组成这种成分的红光,绿光,蓝光的强度(对于光的颜色而言,alpha值被忽略)。</p> <p>红色射线的光源成分分布:</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203401_taL7.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203401_j9Ds.png" width="588" height="126"></a></p> <p>红色射线不包含绿光和蓝光成分。这些光源成分的强度取值范围在0.0到1.0之间。上面的表格说明了红色射线包含很是高的镜面光的成分,一点漫放射光成分,和很是少的环境光成分。(注:镜面光的强度要大于其余成分才可能产生亮点).在被红色光照射的地方你可能(取决于观察点是否在光反射的方向上)会看到一个很亮的红点。</p> <h3>现实世界的材料</h3> <p>材料的颜色是根据它所放射的光的波长来定义的。一个蓝色的球体反射了绝大部分的蓝色光子且吸取了其余颜色的光子。在现实世界中白光包含了全部颜色的光,因此咱们可以看到材料它自己的颜色。若是蓝色的球体在单纯的红光照射下,咱们看到的将是黑色的。</p> <h4>材料的属性</h4> <p>当咱们使用光照时,咱们是经过材料的反射属性来描述它的颜色的。咱们会说一个多边形反射了绝大多数的红光,而不会说这个多边形是红色的。咱们为三种光源:环境光,漫放射光,镜面光,指定材料相应的反射属性。一个材料可能会很好的反射镜面光,却吸取了大多数的漫放射光和环境光。</p> <h4>给材料添加光照</h4> <p>物体有它本身反射的颜色,光源也有它本身的颜色。OpenGL是如何决定使用哪一种颜色的?</p> <h4>环境光的效果</h4> <p>若光源颜色为( LR , LG , LB ),材质颜色为( MR , MG , MB ),最终颜色为( LR*MR , LG*MG , LB*MB )。(B1+B2)*MB )。所以,材料的颜色成分决定了入射光被反射的百分比。例子:</p> <p>光源颜色为(0.5, 0.5, 0.5), 材料的颜色为(0.5, 1.0, 0.5)那么最终的颜色是</p> <p>(0.5*0.5, 0.5*1.0, 0.5*0.5) = (0.25, 0.5, 0.25) 。</p> <p>公式</p> <p><em>ambient</em> = <em>K<sub>a</sub></em> x <em>globalAmbient</em></p> <p><a href="http://static.oschina.net/uploads/img/201309/29203401_nKrz.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203401_tzTi.png" width="593" height="213"></a></p> <h4>漫反射光与镜面光的效果</h4> <p>漫反射光具备方向性,并且照射在物体表面上光的强度与光源和表面的夹角、光源和表面的距离以及相关的衰减因素有关(在光源和物体之间是否有雾)。</p> <p>反射光的计算一般用Lambert定律: <p>Ildiff = Kd * Il * Cos(θ)<br>其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0&lt;=A&lt;=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等价于dot(N,L),故又有:<br>Ildiff = Kd * Il * dot(N,L) <ul></ul> <p>镜面光的计算方法比较复杂。最经常使用的计算方法是:先经过光线的方向向量和物体的平面法向量来计算出光线的反射方向向量。而后再用光线的反射方向向量和视线的方向向量作点积来计算出光线对眼睛的做用强度。再把这个计算获得的做用强度以光泽度值做乘方运算来增长高光部分的汇聚性,减小扩散。最后再把计算结果乘上光线自己的颜色。</p> <p>冯氏模型公式以下:</p> <p>spec = Ks * Il * ( dot(V,R) )^Ns<br>其中Ks 为镜面反射系数,Ns是高光指数,V表示从顶点到视点的观察方向,R表明反射光方向。因为反射光的方向R能够经过入射光方向L(从顶点指向光源)和物体的法向量求出,<br>R + L = 2 * dot(N, L) * N&nbsp; 即 R = 2 * dot(N,L) * N - L<br>因此最终的计算式为:<br>Ispec = Ks * Il * ( dot(V, (2 * dot(N,L) * N – L ) )^Ns <p>&nbsp; <ul></ul> <p>参考 <a href="http://cs.hust.edu.cn/webroot/courses/csgraphics/jiaocai.php?bookpage=10_a">华科计算机图形学</a></p> <p>&nbsp;<a href="http://www.cnblogs.com/heww/articles/1666392.html">http://www.cnblogs.com/heww/articles/1666392.html</a></p> <p><a href="http://www.web-tinker.com/article/20168.html">http://www.web-tinker.com/article/20168.html</a></p>php

相关文章
相关标签/搜索