【一步步学Metal图形引擎8】-《环境光》

教程 8

环境光

教程源码下载地址: https://github.com/jiangxh1992/MetalTutorialDemos

CSDN完整版专栏: https://blog.csdn.net/cordova/category_9734156.html

一、原理

之前的教程中我们讨论了平行光下漫反射和镜面反射的实现,得到好不错的光照效果。但是由于平行光只有一个单一的方向,物体背向平行光的位置会处于阴影之中,漆黑一片。而现实中,光线由于在物体间来回弹射,即使是太阳照不到的地方也会一定程度上被均匀照亮,被我们看见,而不会漆黑一片。为了模拟这种四处弹射的间接光均匀照亮阴影区域的现象,我们加入了环境光这种新光源。

在这里插入图片描述
环境光是一种没有方向的光,只有一个光源的强度来表示,可以照到任意区域,是一个方向无关的常量光源。环境光是比较微弱的基础光,我们将环境光叠加到平行光效果之上,这样阴影处会柔和照亮,高光处亮度也会略微增加。

环境光的计算公式简单表示如下:

在这里插入图片描述
Ia是环境光光源的强度,ka是物体表面对环境光的反射系数。

我们将环境光强度叠加到之前的漫反射和镜面反射之上的到最终的光照模型公式如下:

在这里插入图片描述
实际上环境光是对平行光的间接光的一种抽象简单模拟,真实的间接光的计算会更加复杂,像光线追踪迭代等高级光照技术可以更加精确的模拟计算。

二、源码分析

2.1 ShaderTypes.h

// ...
float Ia; // 环境光强度
float Ka; // 环境光系数
// ...

Uniform Buffer中添加环境光强度变量和环境光系数。

2.2 Render.m

// ...
uniforms->Ia = 3.0f;
uniforms->Ka = 0.1f;
// ...

updateGameState函数中更新环境光参数。

2.3 Shaders.metal

// Ambient Glow
float ambient = uniforms.Ia * uniforms.Ka;

片段着色器中加入环境光强度的计算。

float3 out = float3(uniforms.directionalLightColor) * float3(color_sample.xyz) * (diffuse + specular + ambient);

最后叠加到漫反射和镜面反射之上。

三、运行效果

加了环境光之后,可以看出相比于之前,背光的区域不再是漆黑一片。

在这里插入图片描述

在这里插入图片描述

©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值