投光物
投光 : 光源把光照射到物体上;
定向光
当光源被设置为无限远时,它被称为定向光(Directional Light),因为所有的光线都有着同一个方向,独立于光源位置。
我们最常见的定向光源的例子是:太阳,来自于太阳的所有光线都被定义为平行光:

所有的光线都是平行的,对于场景中的每个物体光的方向都保持一致,物体和光源的位置保持怎样的关系都无所谓。由于光的方向向量保持一致,光照计算会和场景中的其他物体相似。
开发
- 修改片段着色器中光源的定义,去除光的位置定义,加入方向的定义,如下:
struct Light
{
// vec3 position;
vec3 direction;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
- 将光方向标准化
vec3 lightDir = normalize(-light.direction);
- 设置光的方向
//设置定向光的属性
m_pShader->setVec3("light.direction", -0.2f, -1.0f, -0.3f);
- 添加多个物体
for(int i=0; i<10; i++) {
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, cubePositions[i]);
model = glm::rotate(model, glm::radians(20.0f *float(glfwGetTime())), glm::vec3(1.0f, 0.3f, 0.5f));
model = glm::scale(model, glm::vec3(0.5f));
m_pShader->setMat4("model", model);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
-
运行效果
定向光效果图
网友评论