本帖依据learnOpenGL教学中的光照->基础光照内容作为指导资料
1、计算漫反射光,需要的数据
- 法向量:一个垂直于顶点表面的向量。
- 定向的光线:作为光源的位置与片段的位置之间向量差的方向向量。为了计算这个光线,我们需要光的位置向量和片段的位置向量。
2、由于我们这里物体是立方体,立方体的法向量可以直接由我们指定数据,通过顶点着色器传入获得。
3、分别配置顶点着色器与片段着色器中需要的变量
顶点着色器
#version 300 es
in vec4 position;//位置
in vec3 aNormal;//法向量
out vec3 FragPos;//顶点在世界空间中的位置
out vec3 Normal;//将法向量传递给片段着色器
uniform mat4 projectionMatrix;//投影矩阵
uniform mat4 cameraMatrix;
uniform mat4 modelMatrix;
void main() {
fColor = color;
TextureCoordsOut = uv;
Normal = aNormal;
FragPos = vec3(modelMatrix * position);
mat4 mvp = projectionMatrix * cameraMatrix * modelMatrix;
gl_Position = mvp * position;
}
片段着色器
#version 300 es
precision highp float;
out vec4 FragColor;
in vec3 Normal;
in vec3 FragPos;
uniform vec3 objectColor;//物理自身颜色
uniform vec3 lightColor;//光源
uniform vec3 lightPos;//光源的位置向量
void main(void) {
float ambientStrength = 0.1;//环境光照影响因子
vec3 ambient = ambientStrength * lightColor;//环境光照分量
vec3 norm = normalize(Normal);//标准化法向量
vec3 lightDir = normalize(lightPos - FragPos);//光的方向向量
float diff = max(dot(norm, lightDir), 0.0);//点乘,计算光源对当前片段实际的漫发射影响,只取大于0的数据
vec3 diffuse = diff * lightColor;//漫反射分量
vec3 result = (ambient + diffuse) * objectColor;//组合两分量得出最终结果
FragColor = vec4(result,1.0);
}
给物体颜色objectColor和光源lightColor赋值
GLuint object = glGetUniformLocation(program, "objectColor");
glUniform4f(object, 1.0, 0.5, 0.31, 1.0);
GLuint light = glGetUniformLocation(program, "lightColor");
glUniform4f(light, 1.0, 1.0, 1.0, 1.0);
由于我们指定了法向量是从数组中读取,所以需要激活属性,并指定读取的起点以及规则
// 激活顶点属性
GLuint normal = glGetAttribLocation(program, "aNormal");
glEnableVertexAttribArray(normal);
glVertexAttribPointer(normal, 3, GL_FLOAT, GL_FALSE,11 * sizeof(GLfloat), NULL + 8 * sizeof(GLfloat));
这里本人出现了个小问题,就是上述激活属性并指定的操作位置放的不对,导致aNormal读取数据一直失败
究其原因,应该是轮到最下面的代码时,VBO顶点缓存数据绑定与顶点数组绑定变到的VAO_light里,也就是我为光源另外开辟的一个VAO数组。在激活数组中的属性并指定指针时是错乱的所导致,具体内部详细原因还等待进一步深究。
有任何问题都可以评论留言~