phong着色.docx_第1页
phong着色.docx_第2页
phong着色.docx_第3页
phong着色.docx_第4页
phong着色.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Phong光照模型的简单说明我简单地介绍一下Phong光照模型.虽然这种光照模型算是比较古老的,但是通过合适的参数设置,仍然可以实现真实的效果。我们的目标是渲染出以下效果,这里以Doom3的男主角为例(终于不是怪物了.)一般而言,Phong光照模型分为三个累加阶段:漫反射,镜面反射和环境光以下按顺序说明:1.漫反射(Diffuse)对于表面比较粗糙的物体,基本表面的明暗就是漫反射效果,比如裤子的材质。某一个象素的明暗系数只取决于该点与光源的相对位置,而与眼睛的位置无关。diffuse_color = base_map * ( N * V_L )* mat_diffuse * light_diffuse;上式中base_map代表该点的基础颜色,一般通过纹理索引;N 是该点的法线;V_L是该点到光源方向的单位向量;N * V_L 即两者的点积,注意需要用max( ( N * V_L ), 0 ),因为负的值是没有意义的;mat_diffuse和light_diffuse分别是材质和光源的漫反射系数,用来宏观调制漫反射的颜色。下图是只有N * V_L 项的渲染结果:2.镜面反射(Specular)尽管漫反射已经可以很好地表达光照,但是由于它是与视点无关的,所以多少有些欠缺生动,而镜面反射是视点相关的,所以会随着眼睛位置的变化而“流动”。specular_color = pow( v_e * v_l, gloss ) * mat_specular * light_specular;这里解释一下:v_e 是e_v的反射向量(v_e = reflect( e_v, n ) ),而e_v是眼睛到该点的单位向量,所谓反射向量,即以与该点的法线所垂直的平面做镜面反射所得到的向量(虽然按照原理来说,应该是光线反射,而非视线反射.都没有问题吧);v_l是该点到光源的单位向量;v_e * v_l 是两者的点积, 同样要用max(v_e * v_l, 0),负的值也是不需要的;pow是幂积,点积是底,gloss是指数;gloss用来调制亮斑的大小,一般来说,gloss越大,光斑越细小,gloss越小,光斑分布越宽泛。mat_specular,light_specular分别是材质和光源的镜面反射系数,用来宏观调制镜面反射的颜色。注意不是点乘,而是各项分别相乘,就是所谓的调制.下图是只有镜面反射系数的渲染结果:3.环境光(ambient)光照不到的地方是不是就是全黑的呢,对于受空气散射影响比较大的环境来说不是的(比如说室外环境),这里只是简单的对base_map调制了一下:ambient_color = base_map * mat_amvient * light_ambient;4.累加(accumulate)最后就是将他们相加了:result_color = diffuse_color + specular_color + ambient_color;5.其他(1)在以上式中所使用的法线是由各顶点的法线插值得到的,我们可以使用法线贴图来编码各点的实际法线值,以获得更细致的表面:这里是将一个法线的三维向量封装入纹理的RGB分量,另外还涉及一个世界空间到纹理空间的转换,这里不做描述,因为我的实际做法是错误的,却换来正确的结果,所以.我也不清楚啦.(2)使用一张单独的图来编码各点的镜面反射系数,比如有油漆的地方反射较弱,而磨光的地方则反射较强烈(见盔甲部分)(3)以上效果都是利用光照产生的立体错觉,如果失去光照,立体感也将随之消失。对于环境光,我们应该有更好的处理方法,如利用虚拟的光源等等。我在该渲染中使用了两盏灯,产生的效果还不错。(4)说到底,phong模型对金属表面渲染很成功,但对人物表面渲染欠佳,所以才有SSS等等更为先进的模型;但另一方面,Phong模型仍然是最基础和重要的光照模型,当初的固定流水线采用的就是它(当然镜面反射略有不同)先这些吧.接下来让我们看看Phong模型:我们知道,在理想状况下,镜面反射后的光之集中在一条线上,因此我们的视线离这条线的距离越近,射入我们眼中的光线就越多,我们看到的光强也就越强。同时,镜面反射也与物体表面的高光指数(物体表面光泽程度)有关,其数值越大,反射后的光线越集中,反之则越分散,这里可能会有人想:如果将高光指数设置的很大,也就是光线极其分散,Phong是否可以用来代替Lambert?我想答案肯定是不行的,原因是漫反射是将光线反射到各个角度,而镜面反射即使反射光线再分散,它们依旧被限制在一个90度的区域中,因此与漫反射的效果是不一样的。下面给出公式:I_spec = k_z * I_l(V R)n_s其中:k_z为表面材质的镜面反射系数,n_s是高光指数,V表示顶点到视点的向量,R表示反射光的单位向量。但是在实际的程序编写中,我们一般都会更容易得到入射光线的单位向量L,所以我们最好转换一下公式。设顶点的单位法向量为N,有公式:R + L = (2N L)N (这里再次提醒一下,L的方向是由顶点指向光源的)由这个可以推出:R = (2N L)N - L所以模型公式可以变为:I_spec = k_z * I_l(V (2N L)N - L)n_s下面是用Cg语言实现Phong模型的代码:/*/*Phone镜面光照模型,同时也加入了Lambert漫反射光照模型 */*/struct vertex_In float4 in_Position : POSITION; float4 in_Normal : NORMAL;struct vertex_Out float4 out_Position : POSITION; float4 out_Color : COLOR0;void main_v(vertex_In vertexI, out vertex_Out vertexO, uniform float4*4 modelViewProj, uniform float4*4 worldMatrix, uniform float4*4 worldMatrix_IT, uniform float3 globalAmbient, uniform float3 eyePosition, uniform float3 lightPosition, uniform float3 lightColor, uniform float3 K_d, uniform float3 K_s, uniform float N_s ) vertexO.out_Position = mul(modelViewProj , vertexI.in_Position);/计算输出定点位置 float3 worldPosition = mul(worldMatrix , vertexI.in_Position).xyz;/计算定点世界位置 float3 N = normalize(mul(worldMatrix , vertexI.in_Normal).xyz);/计算定点法线向量 float3 V = normalize(eyePosition - worldPosition);/计算定点到视点的方向 float3 L = normalize(lightPosition - worldPosition);/计算入射光方向 float3 R = normalize(N*max(dot(2*N , L) , 0) - L);/计算反射光方向 float3 diffuseColor = K_d*globalAmbient + K_d*lightColor*max(dot(N , L) , 0);/计算漫反射光强 float3 specularColor = K_s*lightColor*pow(max(dot(V , R) , 0) , N_s);/计算镜面反射光强 vertexO.out_Color.rgb = diffuseColor + specularColor; vertexO.out_Color.a = 1;以上代码只使用了顶点着色程序,因此只对几何顶点进行渲染,而不对片段内部的点进行处理,因此如果用来渲染低精度模型效果会很不好,因此我们就要再加入片段着色程序。代码如下:/*/*Phone镜面光照模型,同时也加入了Lambert漫反射光照模型*/*/struct vertex_In float4 in_Position : POSITION; float4 in_Normal : NORMAL;struct vertex_Out float4 out_Position : POSITION; float4 out_objecPos : TEXCOORD0; float4 out_objectNormal : TEXCOORD1;void main_v(vertex_In vertexI, vertex_Out vertexO, uniform float4*4 modelViewProj )/顶点着色程序入口 vertexO.out_Position = mul(modelViewProj , vertexI.in_Position);/计算输出定点位置 vertexO.out_objectPos = vertexI.in_Position; vertexO.out_objectNormal = vertexI.in_Normal;void main_f(vertex_Out vertexI, out float4 colorO : COLOR, uniform float4*4 worldMatrix, uniform float4*4 worldMatrix_IT, uniform float3 globalAmbient, uniform float3 eyePosition, uniform float3 lightPosition, uniform float3 lightColor, uniform float3 K_d, uniform float3 K_s, uniform float N_s )/片段着色程序入口 float3 worldPos = mul(worldMatrix , vertexI.out_objecPos).xyz;/计算定点世界位置 float3 N = normalize(mul(worldMatrix , vertexI.out_objectNormal).xyz);/计算定点法线向量 float3 V = normalize(eyePosition - worldPosition);/计算定点到视点的方向 float3 L = normalize(lightPosition - worldPosition);/计算入射光方向 float3 R = normalize(N*max(dot(2*N , L) , 0) - L);/计算反射光方向 float3 diffuseColor = K_d*globalAmbient + K_d*lightColor*max(dot(N , L) , 0);/计算漫反射光强 float3 specularColor = K_s*lightColor*pow(max(dot(V , R) , 0) , N_s);/计算镜面反射光强 colorO.rgb = diffuseColor + specularColor; colorO.a = 1;这样的话程序就会对片段中的点也进行处理,渲染效果也会好一些。Phong着色法(Phong shading),是三维电脑图像的绘图技巧之一,结合了多边形物体表面反射光的亮度,并以特定位置的表面法线作为像素参考值,以插值方式来估计其他位置像素的色值。这个方法由美国越南裔学者裴祥风(Bi Tng Phong)发明,于1973年的博士论文首度发表。与Gouraud着色法比较,Phong着色法的效果比前者更逼真,但运算程序也比前者为复杂。其原理要从光照和光线的反射讲起。光线的反射有两种极端情况,一种是漫反射,另一种是镜面反射。取得这两种反射情况的数学公式是不同的。此外,由于我们看到的许多物体表面并没有受到光源的直接照射,而是受到在周围环境中几经反射的光的照射,物体之间复杂的反射现象也需要以某种方式反映在着色模型里。由此还要引进一种环境光,它照射到场景的所有表面,并被每一个表面均匀地向所有方向反射。Phong着色模型是将物体表面的光反射看成是环境光的反射之和与光源直接有关的漫反射及镜面反射的组合。从数学上讲就是将反射的总能量看做是光环境的强度,点光源的强度乘以三个不同的系数后相加的和。这三个系数分别是代表物体表面反射环境光、产生漫反射和产生镜面反射的能力。为每一个要知道颜色的点计算颜色通常需要很高的代价。这在产生图像的目的仅仅是浏览一下的情况下是没必要的。为了解决这个问题,我们只是有选择的在某些表面点上全面的使用模型公式,然后依靠颜色差值和表面法线向量差值等技术来为其表面点着色Phong着色法(Phongshading),是三维电脑图像的绘图技巧之一,结合了多边形物体表面反射光的亮度,并以特定位置的表面法线作为像素参考值,以插值方式来估计其他位置像素的色值。这个方法由美国越南裔学者裴祥风(BiTngPhong)发明,于1973年的哲学博士论文首度发表。与Gouraud着色法比较,Phong着色法的效果比前者更逼真,但运算程序也比前者为复杂。其原理要从光照和光线的反射讲起。光线的反射有两种极端情况,一种是漫反射,另一种是镜面反射。取得这两种反射情况的数学公式是不同的。此外,由于我们看到的许多物体表面并没有受到光源的直接照射,而是受到在周围环境中几经反射的光的照射,物体之间复杂的反射现象也需要以某种方式反映在着色模型里。由此还要引进一种环境光,它照射到场景的所有表面,并被每一个表面均匀地向所有方向反射。Phong着色模型是将物体表面的光反射看成是环境光的反射之和与光源直接有关的漫反射及镜面反射的组合。从数学上讲就是将反射的总能量看做是光环境的强度,点光源的强度乘以三个不同的系数后相加的和。这三个系数分别是代表物体表面反射环境光、产生漫反射和产生镜面反射的能力。为每一个要知道颜色的点计算颜色通常需要很高的代价。这在产生图像的目的仅仅是浏览一下的情况下是没必要的。为了解决

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论