1. 现实光照的复杂性与OpenGL简化模型

    • 现实世界光照复杂,受多种因素影响,难以模拟。
    • OpenGL使用简化模型,如冯氏光照模型,近似现实情况以便更易处理并看起来类似。
  2. 冯氏光照模型

    • 由环境、漫反射和镜面光照三个分量构成。
    • 模拟环境光照、漫反射和镜面光照对物体的影响。
  3. 环境光照

    • 模拟环境中即使黑暗也存在的微弱光线,给物体一些颜色。
    • 通过光的颜色乘以常量环境因子,再乘以物体的颜色,将结果作为片段的颜色。
  4. 漫反射光照

    • 受光线方向影响,角度越接近光源,物体片段越亮。
    • 计算漫反射光照需要法向量、光线方向和片段位置。
    • 使用法向量和光线方向的点乘计算影响,乘以光的颜色,得到漫反射分量。
  5. 环境光照

    • 模拟即使在黑暗情况下仍有一些光线存在,为物体增添常量颜色以模拟周围光线的影响。
    • 通过乘以环境因子和物体颜色来计算片段的颜色。
  6. 漫反射光照

    • 反映光源对物体方向性影响,计算光线与物体法向量之间的角度,乘以光的颜色以得到漫反射分量。
    • 强调正对光源的部分更亮,角度越大,片段越暗。
  7. 法线矩阵

    • 介绍了如何转换法向量到世界空间坐标,避免了不等比缩放对法向量造成的影响。
    • 使用法线矩阵针对模型矩阵的左上角3x3部分的逆矩阵的转置矩阵来修复法向量的变换。
  8. 镜面光照

    • 计算入射光线的反射向量和观察方向,以及两者之间的夹角来实现高光效果。
    • 加入到环境光和漫反射光的组合中,以模拟物体表面的反射性

Code

漫反射

https://gist.github.com/Flandre923/e0e1c5eb1fbfd712c27b54a3c3b6dc35

镜面光照

https://gist.github.com/Flandre923/8eb43384d2f7c05f780b58f462b97788

练习

1

1
2
3
4
5
6
7
8
9

float angle = (float) (20 * GLFW.glfwGetTime());
float radius = 1;
Vector3f lightPos = new Vector3f(
(float) (Math.sin(Math.toRadians(angle)) * radius),
1.0f,
(float) (Math.cos(Math.toRadians(angle)) * radius)
);

2