OpenGL学习日记-2014.12.21--光照

  o(╯□╰)o深患中度拖延症,也是从开始写这篇笔记到结束居然用了一个月。。。虽然中间是发生了不少事,不过明明就有无数机会可以完成,就是拖着没写代码,各种借口。。。面对如此拖延症该如何是好QAQ快哭了


正文:

突然觉得这些日记写着写着就没什么意思。。。只是简单梳理一下书中的内容,没经过很多的思考,可不写心里更虚,怕自己几天就把看的书忘了。对于很多概念,都由于没有好好去写代码验证,而理解流于表面。对于光照这章也是下决心细细琢磨一番(现在才下的决心o(╯□╰)o),毕竟这很重要。


一、光照和颜色密切相关,光照也是由不同颜色的光去描述,所以由于颜色的表示有两种模式:rgba模式和颜色索引模式,所以光照也分为rgba下的光照,和颜色索引模式下的光照。不过同样的是rgba模式下的光照灵活方便,主要还是使用rgba下的光照模式。

二、隐藏表面消除工具:
    本这提高渲染效率的目标,OpenGL最终应该只渲染看得的物体,而消除那些被其他物体挡住的物体,或者是它的一部分。在三维场景中,有些物体可能被遮挡,而随着观察点的变化,物体的遮挡关系也随之改变,所以必须维护更新这种遮挡关系。所谓的隐藏表面消除就是消除实心物体被其他物体所遮挡那部分。而实现他的最简单方法就是深度缓冲区(其实不是很明白书本在这里提一提深度缓冲区是几个意思。。)。
    深度缓冲区原理:把一个距离观察平面的(通常是近侧裁剪平面)的深度值(距离)与窗口中的每个像素关联。
                1.glClear( GL_DEPTH_BUFFER_BIT)可以把深度缓冲区的所有值设为最大值,最远距离。
                2.以任意顺序绘制物体
                3.硬件或软件所执行的图形计算会把每个被绘制的表面转换为窗口上的一些像素的集合,并不考虑它们之间的遮挡关系。如果OpenGL开启了深度测试,OpenGL则会计算这些表面与观察平面的距离,在绘制每个像素之前,把它的深度值与深度缓冲区的值比较,根据他么的大小关系去保留和丢弃对应的颜色值。

三、现实世界和OpenGL关照
    现实世界的光照是十分复杂的,完全的模式在计算量上近乎不可能。OpenGL只是进行了简单的模拟,并且大多数情况下效果还是不错的。
    在OpenGL光照模型中只有存在能吸引和反射光线的表面存在,光源才会产生效果。OpenGL光照模型分为4中独立的成分:环境光、散射光、镜面光、发射光。这四种成分可以进行单独的计算,并叠加在一起。
    a.环境光(ambient light):是那些在环境中进行了充分的散射,无法分辨其方向的光,它似乎来自所有方向(现实世界的定义)。
    b.散射光(diffuse light):它来自某一个方向,因此,当它从正面照射物体是物体显得亮一些,倾斜则显得暗一些。不过当它撞击表面时,他会均匀的向所有方向发散,所以无论眼睛在哪个位置,散射光看起来都一样亮。
    c.镜面光(specular light):也来自某个特定的方向,并且从表面向特定的方向反射。当一束经过充分校准的激光从一面高质量的镜子上反弹回来时,他所产生的几乎是100%的镜面反射光。具有光泽的金属或塑料而具有很高的镜面成分,粉笔和地毯则几乎不存在镜面成分(不得不说,红书的例子都挺贴切的)。这里提到镜面成分,是表面的材质,光照和材质相互作用产生了最后到达眼睛的光,看到的效果。
    d.发射(颜色)光(emissive color):他模拟那些源自某个物体的光,在OpenGL光照模型中发射颜色可以增加物体的强度,但是发射颜色不受任何光源的影响,并且不作为一个光参与其他物体的光照计算,也就是仅仅影响发射物体自己本身。

四、材料和颜色
    在OpenGL光照模型中,物体的颜色取决于他反射了红、蓝、绿光的成分比例决定。如果物体不反射光,那么它就是黑色的。每种 光都是由 不同比例的红、绿、蓝光组成你,对于材料而言,他的RGB值和它对光的这些颜色反射比例成 正比。如果一种材料的R=1、G=0.5、B=0,他将反射所有的红光,一半的绿光,不反射蓝光。假设,入射光线成分:(LR,LG,LB),一种材料Rgb(MR,MG,MB),在忽略了其他所有已反射效果之后,进入眼睛的光就是(LR·MR,LG·MG,LB·MB)。另外,如果有两束光进入眼睛,他们的成分分别是(R1,G1,B1)和(R2,G2,B2)那么OpenGL会把他们叠加(R1+R2,G1+G2,B1+B2),超过1的值将被截取为1.

 五、创建光源
    光源有几种属性:颜色,位置,方向。在OpenGL世界中,光源的处理思想大致和一般三维物体差不多。用于指定光源所有参数的函数:glLight*(GLenum light, GLenum pname, TYPE param/*param)系列函数。有些参数只作用于特定光源。

pname 参数名 缺省值 说明
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) RGBA模式下环境光
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值