贸商网本站服务帮助中心手机版

贸商网

  • 全站
  • 招商
  • 供应
  • 求购
  • 产品
  • 资讯
  • 展会
  • 企业
您现在的位置:贸商网 > 资讯中心 > 物联网 > 学习OpenGL ES之高级光照

学习OpenGL ES之高级光照

时间:2017-07-03  作者:贸商网  点击:67  评论:  字体:T|T

 学习OpenGL ES之高级光照

在基本光照中为大家介绍了环境光和漫反射光构成的基本光照模型。本文将为大家介绍Blinn-Phong光照模型,通过环境光,漫反射光和高光渲染出更加真实的物体。

学习OpenGL ES之高级光照


Blinn-Phong光照模型分为三个部分,环境光,漫反射光,高光(也可以理解为镜面反射光),将这三种光和物体本来的颜色融合,就可以计算出最终的颜色了。下面我们先来介绍这三种光的物理含义。

环境光

真实世界里,就算在晚上,物体也不一定会处于完全黑暗状态,总会有一些微弱的光源照亮物体,比如月光,被灯光照亮的天空等等,为了模拟这种情况,我们使用环境光这一概念来表达周围环境提供的微弱光亮。对于环境光我们可以使用环境光颜色 ambientColor 和强度 ambientIndensity 来表示。 ambientColor 乘以 ambientIndensity 就是环境光产生的颜色。

如果你处于大森林中又恰巧乌云蔽月,应该就不用计算环境光了。

漫反射光

表面粗糙的物体会将光反射到各个方向,无论我们从哪个方向观察它,都会看到一样的光照效果。我们把这些光称为漫反射光。

白光是由各种不同颜色(波长)的光组成的。如果我们看到物体是红色,就表明这个物体把除了红光外的其他光都吸收了。我们可以用向量乘法轻松的来表达这一物理现象。

物体颜色 = (1.0, 0.0, 0.0) // r,g,b白光 = (1.0, 1.0, 1.0) // r,g,b白光照射物体后 = (1.0, 1.0, 1.0) * (1.0, 0.0, 0.0) = (1.0 * 1.0, 1.0 * 0.0, 1.0 * 0.0) = (1.0, 0.0, 0.0)

有了这个公式,我们可以随意调整物体的颜色和光的颜色,然后通过它计算出最终色。除了颜色我们还需要计算接受到的光照强度,这个在基本光照中已有提及。我们通过光线和法线的夹角来计算接受到的光照强度。强度乘以上面计算出的最终色就是漫反射光产生的颜色。

学习OpenGL ES之高级光照


高光

表面光滑的物体,比如汽车的烤漆,光滑的金属,会对光进行镜面反射,如果你的眼睛刚好在光线的反射光附近,那么你将看到强烈的光照。传统的Phong光照模型就是先计算光线相对于当前法线的反射光,然后将视线向量和反射光向量点乘来计算观察到的反射光强度。但是这种算法在视线和反射光夹角大于90度时效果不佳,所以本文采用Blinn-Phong模型来计算反射光强度。

学习OpenGL ES之高级光照


我们先求解出视线向量和光线向量的半向量H,就是将视线向量和光线向量规范化后相加再规范化。然后将H和法向量N点乘来计算高光强度 specularStrength 。计算出强度后,我们会使用一个参数 smoothness 再次处理强度, specularStrength= pow(specularStrength, smoothness) , smoothness 越大,高光就会使平面显得越光滑。

学习OpenGL ES之高级光照

红色是pow(cos, 100)曲线,绿色是cos曲线。

通过上图我们可以看出来,对cos进行幂运算,指数越大,曲线边缘下降越快,而且越窄。我们看到的光滑表面一般都具有较窄和快速衰减的高光,所以smoothness取较大值时,可以模拟光滑的表面。

Fragment Shader

了解完原理后,接下来我们来看看新的Fragment Shader。

precision highp float;// 平行光struct Directionlight {vec3 direction;vec3 color;float indensity;float ambientIndensity;};struct Material {vec3 diffuseColor;vec3 ambientColor;vec3 specularColor;float smoothness; // 0 ~ 1000 越高显得越光滑};varying vec3 fragNormal;varying vec2 fragUV;varying vec3 fragPosition;uniform float elapsedTime;uniform Directionlight light;uniform Material material;uniform vec3 eyePosition;uniform mat4 normalMatrix;uniform mat4 modelMatrix;uniform sampler2D diffuseMap;void main(void) {vec3 normalizedLightDirection = normalize(-light.direction);vec3 transformedNormal = normalize((normalMatrix * vec4(fragNormal, 1.0)).xyz);// 计算漫反射float diffuseStrength = dot(normalizedLightDirection, transformedNormal);diffuseStrength = clamp(diffuseStrength, 0.0, 1.0);vec3 diffuse = diffuseStrength * light.color * material.diffuseColor * light.indensity;// 计算环境光vec3 ambient = vec3(light.ambientIndensity) * material.ambientColor;// 计算高光vec4 eyeVertexPosition = modelMatrix * vec4(fragPosition, 1.0);vec3 eyeVector = normalize(eyePosition - eyeVertexPosition.xyz);vec3 halfVector = normalize(normalizedLightDirection + eyeVector);float specularStrength = dot(halfVector, transformedNormal);specularStrength = pow(specularStrength, material.smoothness);vec3 specular = specularStrength * material.specularColor * light.color * light.indensity;// 最终颜色计算vec3 finalColor = diffuse + ambient + specular;gl_FragColor = vec4(finalColor, 1.0);}

首先我们定义了两个结构体 struct Directionlight 和 struct Material ,来描述平行光照和物体材质。下面是他们中成员变量的定义。

Directionlight

you might also like

  • 【完结】OpenGL_ES基础入门(七)-压缩纹理、全屏抗锯齿 FSAA
  • 【连载】OpenGL_ES基础入门(六)-光照
  • 优雅的艺术之Python数据可视化
  • 专访 | 亚信科技CTO於今:Aura的目标在于降低人工智能的学习门槛
  • 物联网促服务业转型 推动生命周期管理革命
  • PIC32学习连载之四:PIC32 DMA工作原理简析
  • OpenGL之使用颜色
  • OpenGL之显示列表
  • 莱迪思半导体为网络周边智能应用提供全新机器学习、传感器至云端安全解决方案
  • OpenGL之基本图元

  • (责任编辑:ioter)
    • 共4页:
    • 上一页
    • 1
    • 2
    • 3
    • 4
    • 下一页

    (编辑:mao35  来源:网络整理)

    顶一下
    发表评论

    共有0位网友发表了评论 查看完整内容


    版权与免责声明:
    ①凡本网注明"来源:贸商网"的所有作品,版权均属于本网,转载请必须注明贸商网,违反者本网将追究相关法律责任。
    ②本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
    ③如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
    今日焦点
    企业动态

    网站服务:QQ:2632106543 广告洽谈:QQ:2632106543 Email:2632106543@qq.com All Right Reserved.   鲁ICP备16030072号-7

    版权所有 贸商网 Copyright ©2014-2024 mao35.com