iOSByOpenGLES:渲染光照中实现光照分量的漫反射光的步骤与踩坑

本帖依据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读取数据一直失败

iOSByOpenGLES:渲染光照中实现光照分量的漫反射光的步骤与踩坑

 

 究其原因,应该是轮到最下面的代码时,VBO顶点缓存数据绑定与顶点数组绑定变到的VAO_light里,也就是我为光源另外开辟的一个VAO数组。在激活数组中的属性并指定指针时是错乱的所导致,具体内部详细原因还等待进一步深究。

 有任何问题都可以评论留言~

iOSByOpenGLES:渲染光照中实现光照分量的漫反射光的步骤与踩坑

上一篇:从 axios 源码中了解到的 Promise 链与请求的取消


下一篇:Entity Framework 数据生成选项DatabaseGenerated(转)