【learnOpenGL学习笔记_9】OpenGL光照基础:从零开始的保姆级实战指南

大家好,我是 同学小张,+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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值