OpenGL学习笔记(十)
来源:互联网 发布:大数据概念股涨停 编辑:程序博客网 时间:2024/05/22 00:54
光照
OpenGL的光照模型把光分成4种独立的成分:环境光、散射光、镜面光和发射光。
环境光(ambient light)
环境光并不来自任何特定的方向。它来自某个光源,但光线却是在房间或场景中四处反射,没有方向可言。
散射光(diffuse light)
OpenGL的散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上均匀地反射开来。因此,如果光线直接指向物体表面,它看上去就更亮一些。如果光线是从一个较大的角度照射到物体表面上,它看上去就显得暗一些。
镜面光
和散射光一样,镜面光也具有很强的方向性,但它的反射角度很锐利,只沿一个特定的方向反射。高强度的镜面光趋向于在它所照射的表面上形成的一个亮点,称为镜面亮点。
为了在场景中增加光照,需要执行如下步骤:
1. 定义每个物体的每个顶点的法线向量。这些法线决定了物体相对于光源的方向
2. 创建和选择一个或多个光源,并设置它们的位置
3. 创建和选择一种光照模型,它定义了全局环境光的层次以及观察点的有效位置
4. 定义场景中物体的材料属性
单位法线
物体的法线向量决定了它相对于光源的方向。对于物体的每个顶点,OpenGL使用法线判断这个顶点从每个光源接收的光线数量。为了进行正确的光照计算,表面法线必须为单位长度。
让OpenGL把一条法线自动转换为单位法线,可调用
glEnable(GL_NORMALIZE);
但是,这种方法在效率上有所牺牲。我们可以预先计算单位法线,而不是依赖OpenGL自动执行计算。
启用光照
为了告诉OpenGL使用光照计算,可调用:
glEnable(GL_LIGHTING);
这个调用告诉OpenGL在确定场景中每个顶点的颜色时使用材料属性和光照参数。但是,如果没有指定任何材料属性或光照参数,物体将会保持为黑暗的无光照状态。
创建光源
void glLight{if}(GLenum light,GLenum pname,TYPE param);
void glLight{if}v(GLenum light,GLenum pname,const TYPE *param);
创建light指定的光源,它可以是GL_LIGHT0、GL_LIGHT1…或GL_LIGHT7。被设置的光源属性是由pname定义的,它指定了一个命名参数,param表示pname属性将要设置的值。pname参数列表如下:
参数名称 含义
GL_AMBIENT 光的环境强度
GL_DIFFUSE 光的散射强度
GL_SPECULAR 光的镜面强度
GL_POSITION 表示光源位置的坐标(x,y,z,w)
GL_SPOT_DIRECTION 表示聚光灯方向的向量(x,y,z)
GL_SPOT_EXPONENT 聚光指数
GL_SPOT_CUTOFF 聚光灯的切角
GL_CONSTANT_ATTENUATION 常量衰减因子
GL_LINEAR_ATTENUATION 线性衰减因子
GL_QUADRATIC_ATTENUATION 二次衰减因子
多光源
至少可以在场景中指定8个光源(很可能更多,取决于所使用的OpenGL实现)。由于OpenGL需要通过计算来确定每个顶点从每个光源接收多少光,因此光源的数量越多,对应用程序性能的影响就越大。表示8个光源的常量是GL_LIGHT0、GL_LIGHT1…GL_LIGHT7等。启用光源可调用类似glEnable (GL_ LIGHT0)指令。
光照模型
OpenGL的光照模型概念包括下面4个部分:
1.全局环境光强度
2.观察点的位置是位于场景还是位于无限远处
3.物体的正在和背面是否应该执行不同的光照计算
4.镜面颜色是否应该从环境和散射颜色中分离出来,并在纹理操作之后再应用
void glLightModel{if}(GLenum pname,TYPE param);
void glLightModel{if}v(GLenum pname,const TYPE *param);
设置光照模型的属性。被设置的光照模型的特征由pname定义,param表示pname参数被设置的值。pname参数列表如下:
参数名 含义
GL_LIGHT_MODEL_AMBIENT 整个场景的环境光的RGBA强度
GL_LIGHT_MODEL_LOCAL_VIEWER 镜面反射角度是如何计算的
GL_LIGHT_MODEL_TWO_SIDE 指定了单面还是双面光照
GL_LIGHT_MODEL_COLOR_CONTROL 镜面颜色的计算是否从环境和散射颜色中分离出来
设置材料属性
void glMaterial{if}(GLenum face,GLenum pname,TYPE param);
void glMaterial{if}v(GLenum face,GLenum pname,const TYPE *param);
指定一种用于光照计算的当前材料属性。face值可为:GL_FRONT、GL_BACK或GL_FRONT_AND_BACK,表示物体的哪些面应该接受光照。pname表示设置的特定材料属性,param提供了具体的属性值。pname参数列表如下:
参数名 含义
GL_AMBIENT 材料的环境颜色
GL_DIFFUSE 材料的散射颜色
GL_AMBIENT_AND_DIFFUSE 材料的环境和散射颜色
GL_SPECULAR 材料的镜面颜色
GL_SHININESS 镜面指数
GL_EMISSION 材料的发射颜色
GL_COLOR_INDEXES 环境、散射和镜面颜色索引
- OpenGL学习笔记(十)
- OpenGL学习笔记(十)
- OpenGL入门学习[十]
- OpenGL入门学习(十)
- OpenGL ES3.0 《学习笔记 十》 Fragment Shaders
- openGL之光照2(材料、颜色追踪、光源)---openGL学习笔记(十)
- OpenGL入门笔记(十)
- OpenGL入门学习(十)
- opengl 入门学习 随笔十
- OpenGL入门学习(十)
- OPENGL学习视频(十)
- 现代OpenGL+Qt学习笔记之十:使用逐片元渲染提升真实感
- OPENGL学习笔记1
- OpenGL学习笔记
- OpenGL 学习笔记
- OpenGL学习笔记
- OpenGL 学习笔记(1)
- OpenGL学习笔记(一)
- 关于C语言的面试问题
- 如保防止sql注入
- 学长只能帮你到这儿了01-HDU2008
- 顺序表的建立、插入、删除、查找、遍历操作
- 学长只能帮你到这儿了01-HDU2019
- OpenGL学习笔记(十)
- iPhone消息推送机制
- Jsp+Hibernate留言板
- 学长只能帮你到这儿了01-HDU2032
- A. Winner
- Linux下使用socket进行网卡抓包(1)
- 学长只能帮你到这儿了01-HDU2025
- 读书Notes
- 几个java中String类中最常用的方法