第六章 opengl之光照(颜色)

该文详细介绍了如何使用OpenGL和GLSL创建一个光照场景。通过设置顶点和片段着色器,结合物体和光源的颜色,模拟光照反射,产生视觉上的颜色效果。文章中提到了使用VBO和VAO来管理顶点数据,以及如何通过矩阵变换来定位光源和物体。同时,还展示了如何创建和应用不同的着色器程序,以分别处理物体的光照计算和光源的恒定亮度显示。

光照

颜色

颜色由RGB组成,分别是红色,绿色,蓝色。举例定义一个颜色向量:

glm::vec3 coral(1.0f, 0.5f, 0.31f);

而在现实中,人眼看到的是 物体反射后的颜色,也就是说不能被物体吸收的颜色,是人可以感知到的颜色。

颜色反射的定律被直接地运用在图形领域。当我们在OpenGL中创建一个光源时,我们希望给光源一个颜色。假如将光源设置为白色,当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是我们所感知到的颜色)。让我们再次审视我们物体,看看如何在图形学中计算出它的反射颜色。我们将这两个颜色向量作分量相乘,结果就是最终的颜色向量了:

glm::vec3 lightColor(1.0f, 1.0f, 1.0f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (1.0f, 0.5f, 0.31f);

创建一个光照场景

首先我们需要一个物体来作为被投光(Cast the light)的对象,我们将使用前面教程中的那个著名的立方体箱子。我们还需要一个物体来代表光源在3D场景中的位置。简单起见,我们依然使用一个立方体来代表光源。
填一个顶点缓冲对象(VBO),设定一下顶点属性指针等等。
我们首先需要一个顶点着色器来绘制箱子。与之前的顶点着色器相比,容器的顶点位置是保持不变的(虽然这一次我们不需要纹理坐标了),因此顶点着色器中没有新的代码。我们将会使用之前教程顶点着色器的精简版:

#version 330 core
layout (location = 0) in vec3 aPos;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
   
   
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

不要忘了更新顶点数据和属性指针使其与新的顶点着色器保持一致。
因为我们还要创建一个表示灯(光源)的立方体,所以我们还要为这个灯创建一个专门的VAO。当然我们也可以让这个灯和其它物体使用同一个VAO,简单地对它的model(模型)矩阵做一些变换就好了,然而接下来我们会频繁地对顶点数据和属性指针做出修改,我们并不想让这些修改影响到灯(我们只关心灯的顶点位置),因此我们有必要为灯创建一个新的VAO:

unsigned int lightVAO;
glGenVertexArrays(1, &lightVA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值