LearnOpenGL学习笔记——基础光照

冯氏光照模型是计算机图形学中用于模拟真实世界光照效果的基础方法。它包括环境光、漫反射和镜面光照三个部分。环境光提供基本的全局照明;漫反射根据物体表面与光源的角度决定亮度;镜面光照则模拟高光效果,反光度越高,高光点越集中。通过计算法向量、视线方向和反射方向,可以实现这些光照效果的计算。这段内容介绍了如何在着色器中实现这些光照模型,并展示了不同反光度对视觉效果的影响。
摘要由CSDN通过智能技术生成

1.光照模型

现实世界的光照是极其复杂的,而且会受到诸多因素的影响。我们一般模拟光照,使用的是冯氏光照模型:
环境光(Ambient):
即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
漫反射(Diffuse):
模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。
镜面(Specular:
模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。
在这里插入图片描述
环境光照
环境光照是光线照射到物理上,物体本身发的光。

void main()
{
    float ambientStrength = 0.1;
    vec3 ambient = ambientStrength * lightColor;
    vec3 result = ambient * objectColor;
    FragColor = vec4(result, 1.0);
}
	

漫反射光照
漫反射光照距离光源越近,越明亮。光线垂直照射到物体上,和光线和物体有夹角是,亮度是不同的。norm为法向量
在这里插入图片描述

float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;

法向量的变换
法向量只是一个方向向量,不能表达空间中的特定位置。同时,法向量没有齐次坐标。这意味着,位移不应该影响到法向量。但是如果有旋转和缩放(不等比例缩放),顶点的改变会导致法向量不再垂直于表面了。如何计算缩放后的法线
在这里插入图片描述

   Normal = mat3(transpose(inverse(model))) * aNormal;

高光/ 镜面光照
在这里插入图片描述

我们先计算视线方向与反射方向的点乘(并确保它不是负值),然后取它的32次幂。这个32是高光的反光度(Shininess)。一个物体的反光度越高,反射光的能力越强,散射得越少,高光点就会越小。在下面的图片里,你会看到不同反光度的视觉效果影响:

vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;

在这里插入图片描述

https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/#_7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值