CPT205-光与材质
CPT205-光与材质
迟然光源
- 点光源(Point Light)
- 模型简单,用RGB三个分量指定单一颜色发射辐射能。
- 离场景不太近的大光源可视为点光源,光线从光源位置沿径向发散。
- 方向光(Directional Light)
- 也叫无限远/平行光,光线平行。
- 离场景很远的大光源(如太阳)可近似为点光源,但方向效果变化小。
- 聚光灯(Spot Light)
- 由局部光源改造,可设置方向向量、角度限制、位置和颜色,物体在光源方向限制外不被照亮。
光照效果
- 环境光(Ambient Light)
- 是一种通用背景非定向照明,使物体显示固有强度,若无不同阴影,物体呈单色轮廓。
- 由场景中各种表面反射光产生,撞击表面后向各方向均匀散射,方向难以确定,室内背光环境光成分大,室外聚光灯环境光成分小。
- 漫反射(Diffuse Reflectance)
- 光线从一个方向来,垂直照射表面比斜射更亮,撞击表面后向各方向均匀散射,无论眼睛位置在哪,看起来亮度相同。
- 粗糙或颗粒状表面易向各方向散射反射光,影响照明因素包括点光源强度、材料漫反射系数和入射角。
- 镜面反射(Specular Reflectance)
- 光线从特定方向来,倾向于在特定方向反射,如激光束从高质量镜子反射。
- 影响因素包括材料镜面反射系数、视角与反射方向的相对角度、光源强度,反射光颜色与光源相同,随着视角偏离反射方向,反射率迅速下降。
衰减(Attenuation)
- 对于点光源,考虑光因距离产生的衰减,距离衰减模型包含常数、线性和二次项,公式为$f(d)=\frac{1}{k_{c}+k l d+k_{q}d^{2}}$。
- 方向光因无限远不考虑衰减。
光照模型与着色
- 光照模型(Lighting Model)
- 计算物体表面光照位置颜色,考虑透明度、颜色反射系数和纹理参数等光学属性,可应用于每个投影位置或通过插值计算表面颜色。
- Phong模型
- 计算迅速,考虑漫反射、镜面反射和环境光三个分量,使用到光源方向向量、观察方向向量、面法向量和完美反射方向向量四个向量。
- 对于每个点光源有9个系数,与材料属性匹配,模型公式为$I = k_{d}I_{d}l \cdot n + k_{s}I_{s}(v \cdot r)^{\alpha}+k_{a}I_{a}$(不含距离项),每个颜色分量需累加所有光源贡献。
- 多边形着色(Polygonal Shading)
- 顶点着色(Vertex Shading):对每个顶点进行着色计算,顶点颜色可作为顶点属性发送到顶点着色器,或在顶点着色器中计算,默认顶点颜色在传递到片元着色器时进行插值(平滑着色),也可用统一变量进行单一颜色着色(平面着色)。
- 平面(恒定)着色(Flat (Constant) Shading):若三个向量(光源方向、观察方向、法向量)恒定,每个多边形只需计算一次着色,多边形上所有点颜色相同,常用于建模光滑表面,但相邻多边形间小的着色差异可能导致效果不佳。
- 平滑(插值)着色(Smooth (Interpolative) Shading):光栅化器在多边形上插值顶点颜色,若光源远且无镜面反射或观察者远,多边形以恒定颜色着色。
- Gouraud着色:确定多边形顶点法向量(周围网格顶点法向量平均值),使用光照模型计算顶点像素强度,多边形边缘点强度通过顶点值加权平均计算,顶点强度在多边形表面线性插值。
材质属性
- 材质颜色取决于对入射红、绿、蓝光线的反射百分比,如红色球在不同颜色光下的反射情况。
- 材质有环境、漫反射和镜面反射属性,环境反射与入射光源环境光结合,漫反射与光源漫反射光结合,镜面反射同理。环境和漫反射属性定义材质颜色,通常相似,镜面反射通常为白色或灰色,使高光呈现光源镜面强度颜色。
- 漫反射在决定物体颜色感知中最重要,环境反射影响物体整体颜色,环境反射在无直接光照处最明显,漫反射和环境反射不受视点位置影响,镜面反射产生高光,高光强度取决于视点位置。
OpenGL中的实现
- 光源与颜色
- 使用
glLight*()
函数指定光源属性,包括颜色、位置和方向等,函数参数为光源标识、属性和属性值。 - OpenGL中可设置多种光源属性,如环境光、漫反射光、镜面反射光强度、位置、聚光灯方向、指数、截止角、衰减因子等,默认值各有不同。
- 光源位置与方向
- 光源可视为无限远(方向光)或靠近场景(点光源),通过
GL_POSITION
参数的w
值判断,w = 0
为方向光,(x, y, z)
描述方向;w ≠ 0
为点光源,(x, y, z)
指定位置,位置和方向会被模型 - 视图矩阵变换。 - 通过改变光源位置设置点,可实现光源固定、绕静止物体移动或随视点移动三种效果。
- 聚光灯
- 聚光灯默认关闭(
GL_SPOT_CUTOFF
为180.0,即向所有方向发光),可设置截止角(范围[0.0, 90.0],特殊值180.0除外)、指数控制光的集中程度,光强度在锥中心最高,向边缘衰减,方向也会被模型 - 视图矩阵变换。
- 多光源
- OpenGL场景中最多可有8个光源(取决于实现),增加光源数量会影响性能。
- 示例代码展示了如何定义点光源和聚光灯,包括设置各种属性并启用光源。
- 全局环境光
- 使用
GL_LIGHT_MODEL_AMBIENT
参数指定全局环境光的RGBA强度,即使场景中无特定光源,也可使物体可见。
- 局部或无限视点
- 视点位置影响镜面反射高光计算,局部视点更真实但性能降低,默认是无限视点,可通过
glLightModeli()
函数切换。
- 双面光照
- 通常只设置前向多边形光照条件,后向多边形可能照明不正确,若物体内部表面可见,可通过
glMaterial*()
函数为前后面提供不同材质属性,该函数用于设置材质属性,参数包括面、属性和属性值,材质属性大多为RGBA颜色,不同面可设置不同属性,alpha值在任何顶点为漫反射材质的alpha值,在颜色索引模式下,RGBA材质属性不适用。
总结
光照与材质对图形渲染有重要影响,需考虑多种因素,包括光源类型、光照效果、光照模型、着色方法等,结合全局环境光和多光源与材质属性,为减少计算量可应用一些近似方法。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果