大家好,我是 同学小张,+v: jasper_8017 一起交流,持续学习AI大模型应用实战案例、C++、OpenGL,持续分享,欢迎大家点赞+关注,订阅我的大模型专栏,共同学习和进步。
在3D图形的世界里,光照是赋予场景灵魂的关键要素。今天,我们就来深入探讨一下OpenGL中的光照基础,帮助初学者快速上手实操。完整代码见文末。
1. 什么是光照?
光照,简单来说,就是模拟光线在物体表面的反射和折射效果。在现实世界中,光照是极其复杂的,受到诸多因素的影响。但OpenGL通过简化的模型,基于对现实的估计,让我们能够相对容易地模拟出逼真的光照效果。
2. 冯氏光照模型
在OpenGL中,常用的光照模型是冯氏光照模型(Phong Lighting Model)。这个模型由三个主要部分组成:环境光照、漫反射光照和镜面光照。
2.1 环境光照(Ambient Lighting)
环境光照模拟的是即使在黑暗中,物体也不会完全黑暗的效果。这是因为周围环境总会有一些光线散射到物体上。在OpenGL中,我们可以通过一个很小的常量来模拟这种效果。
float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;

主要是在原来光照基础上,乘上一个很小的环境光照系数。效果如下:

2.2 漫反射光照(Diffuse Lighting)
漫反射光照模拟的是物体表面因光线方向不同而产生的明暗变化。面向光源的一面会更亮,而背对光源的一面则会更暗。这需要我们使用法向量(Normal Vector)来计算光线与物体表面的角度。

图左上方有一个光源,它所发出的光线落在物体的一个片段上。我们需要测量这个光线与它所接触片段法线之间的角度。如果光线垂直于物体表面,这束光对物体的影响会最大化。
两个单位向量的角度越小,它们点乘的结果越倾向于1。当两个向量的角度是90度的时候,点乘会变为0。角度越大,光对片段颜色的影响越小。
注意,我们使用的是单位向量(Unit Vector,长度是1的向量)取得两个向量夹角的余弦值,所以我们需要确保所有的向量都被标准化,否则点乘返回的值就不仅仅是余弦值了
所以,为了计算漫反射光照,我们现在需要一个法向量,一个光源的方向向量。而光照的方向向量,我们可以通过光源的位置减去片段位置来得到。最终,我们需要知道以下变量:
- 法向量(Normal)
- 光源位置(Light Position)
- 片段位置(Fragment Position)
2.2.1 法向量设置
由于咱们是初学,为了简单起见,直接将法向量写入顶点着色器中。因为是立方体,所以法线很容易知道。
2.2.1.1 顶点数据加入法向量
// 立方体顶点
float vertices[] = {
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f

最低0.47元/天 解锁文章
438

被折叠的 条评论
为什么被折叠?



