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

Posted Mr_厚厚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一步步学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);

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

三、运行效果

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

以上是关于一步步学Metal图形引擎8-《环境光》的主要内容,如果未能解决你的问题,请参考以下文章

一步步学Metal图形引擎9-《Blinn-Phong光照模型》

一步步学Metal图形引擎9-《Blinn-Phong光照模型》

一步步学Metal图形引擎7-《镜面反射》

一步步学Metal图形引擎7-《镜面反射》

一步步学Metal图形引擎2-《纹理贴图》

一步步学Metal图形引擎2-《纹理贴图》