- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一种符合OpenGL光照引擎软件设计与实现
一种符合OpenGL的光照引擎软件设计与实现
摘要:光照计算是绘制真实感三维图形的关键。文中研究光照处理的原理和基本方法,提出一种符合OpenGL标准光照的软件设计与实现方法。在OpenGL算法仿真平台上的验证结果表明,实现的API符合OpenGL 1.3标准。
关键词:GPU;OpenGL;光照处理;Phong模型;
1 引言
光照处理可以模拟现实世界中光线照射到物体表面的效果。OpenGL标准提出固定的ADS光照模型[1],具体的实现方式没有唯一标准。本文分析OpenGL的光照处理原理,提出一种软件实现,在仿真平台上实现,结果表明正确、完整地完成了光照计算。
2 光照功能的设计
真实反映物体表面的光照效果,关键是选择合适的光照模型。根据光照模型,可以计算出物体显示在屏幕上的每个点的颜色。
2.1 基本模型
若根据光照的物理特性计算,过程非常复杂,因此采用简化光照计算经验模型。OpenGL中采用ADS光照模型,这是最简单的一种光照模型, ADS分别指:
a. 环境光:来自各个方向的光,向各个方向反射;
b. 散射光:来自一个方向的光,向各个方向反射;
c. 镜面光:来自一个方向的光,向一个方向反射;
对于材料而言,还有一个描述表面自身发射的光线量:
d. 发射光:没有来源,向各个方向反射;不能将它看做光源。
对上述各个光进行求和,即可得到物体表面一个点的光照。
除此之外,应添加基于距离的衰减项。OpenGL中采用3个参数对光强衰减进行模拟,即常量衰减因子kc、线性衰减因子kl和二次衰减因子kq。若光源与物体上点的距离为d,则整体衰减因子
OpenGL中还规定了三种基本的光源类型:方向性光源、位置性光源和聚光灯。如图2所示,方向性光源模拟位于无限远处的光源,光照射在物体表面时,入射光都是平行的,光强度与光源的方向无关,也不需要衰减;位置性光源模拟距离一般的光源,入射光的角度取决于光源与物体表面上点的位置关系,光强度取决于光源与物体的位置关系和观察点的位置;聚光灯是对位置性光源的形状加以限制,使它的发射角度限于一个椎体之内。
聚光灯由以下几个参数描述:
a. 聚光灯切角:光锥边缘到光轴的角度;
b. 聚光灯方向:光源沿光轴照射到物体的方向;
c. 聚光灯指数:光锥内部的衰减因子;
根据上述建模过程,OpenGL标准的光照计算公式如图4:
2.2 光照方案
在图形处理系统中,顶点着色器首先对物体每个顶点的光照强度进行计算,得到各个顶点的RGBA值,平滑着色则取顶点阶段计算得到的颜色值进行插值,填充整个图元,这种着色方式也成为Gouraud着色,这样的镜面光呈现非平滑效果,另一种Phong着色可以改善这些不足。
Phong着色在顶点着色器中部做处理,光栅化阶段将顶点和法线都进行插值,在片元处理阶段,使用插值后的顶点和法线计算各片元的颜色。
2.3 数据结构和处理流程设计
根据以上分析,光照计算可分为逐顶点计算和逐片元计算,分别放置在顶点阶段和片段阶段。为了实现更真实的光照,本文采用Phong模型进行模拟,根据Phong模型的基本原理,光照需要在三个阶段处理:
a. 在顶点阶段不进行颜色的计算,只向光栅器传递顶点和法线信息;
b. 在光栅化阶段进行顶点及其属性的插值,并将计算结果赋予各个片元;
c. 在片元阶段进行逐片元的光照计算。
顶点着色器的输入和输出视为包含顶点数据的结构,包含位置、颜色值、纹理坐标等信息。对于每个顶点,顶点着色器只执行一次。各个顶点均独自进行处理,GPU的并行结构适合这样同步处理大量的数据。通过顶点着色器输出的顶点可组装为图元,光栅器生成片元以对图元进行填充。随后片元着色器针对每个片元执行一次,计算片元的颜色值。
根据前面所述光照公式和处理流程,梳理光照计算所需的数据,需要的数据结构如下:
2.3.1 着色器的输入和输出
输入数据结构只考虑光照,包含物体坐标和法向量,Phong着色只输出顶点信息。光照计算需要计算顶点、光源、观察点的相对关系,顶点着色器的输出需要两个坐标:经过裁剪的坐标和世界坐标,输出至光栅器后,各个多边形执行插值计算,各个片元的世界坐标输入至片元着色器。片元着色器对光栅器插值的法线按照光照公式计算各片元的颜色并输出。
2.3.2 光照计算需要的全局变量
除了随着处理流程下发的顶点信息之外,光照计算还需要用户提供的参数,根据OpenGL的规定,定义以下结构体记录这些全局变量。
a. 光照状态,记录光照是否开启和最大支持的灯数目;
b. 光源属性,记录glLight*设置的光源
原创力文档


文档评论(0)