光照在现实世界是很复杂的
游戏引擎中一般使用简单的光照模型进行模拟
如图:
Bling-Phong Light Model 光照模型:
1.环境光照(Ambient Lighting)
即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的
我们会使用一个环境光照常量,它永远会给物体一些颜色
2.漫反射光照(Diffuse Lighting)
模拟光源对物体的方向性影响(Directional Impact)
物体的某一部分越是正对着光源,它就会越亮
3.镜面光照(Specular Lighting)
模拟有光泽物体上面出现的亮点
镜面光照的颜色相比于物体的颜色会更倾向于光的颜色
在OpenGL中如何模拟光照?
大体流程:
a)创建光源和受光照物体
b)着色器中使用光照模型计算每个片段的光照颜色
先创建光源和受光照物体,都用Cube模拟
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.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.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f,