如何为 Phong 着色实施选择光源?

How to pick light source for Phong shading implementation?

我正在尝试实现 Phong 着色模型,但不确定如何选择光源。更具体地说,我不明白光源应该是什么样子。应该是 vec3 吗?或者也许是我在 Java 代码中定义的矩阵?此外,如果我们假设我希望相机成为光源,那么不同的光源应该有什么不同,比如视图世界中其他地方的一个点?我真的很感激解释或指导我应该如何解决这样的问题,而不仅仅是代码。

到目前为止,这是我的顶点着色器中的内容:

 #version 330
 layout(location=0) in vec3 vertex;
 layout(location=1) in vec3 normals;

 uniform mat4 viewMatrix;
 uniform mat4 projMatrix;

 out vec3 vertexColor;
 out vec3 pixelCoordinates;
 out vec3 normalizedNormals;

  void main(){

    if (gl_VertexID < 6) {
            vertexColor = vec3(1.0, 0.0, 0.0);
        } else if (gl_VertexID < 12) {
            vertexColor = vec3(0.0, 1.0, 0.0);
        } else if (gl_VertexID < 18) {
            vertexColor = vec3(0.0, 0.0, 1.0);
        } else if (gl_VertexID < 24) {
            vertexColor = vec3(1.0, 1.0, 0.0);
        } else if (gl_VertexID < 30) {
            vertexColor = vec3(1.0, 0.0, 1.0);
        } else {
            vertexColor = vec3(0.0, 1.0, 1.0);
        }



pixelCoordinates = vec3(viewMatrix*vec4(vertex,1.0));
normalizedNormals = normalize(mat3(viewMatrix)*normals);
gl_Position = projMatrix*viewMatrix*vec4(vertex, 1.0);

 }

这就是我的片段着色器目前的样子:

 #version 330

in vec3 vertexColor;
in vec3 pixelCoordinates;
in vec3 normalizedNormals;
out vec3 pixelColor;

void main(){



float il = 1;
float ia = 0.2;
float id ;

vec3 v = normalize(-pixelCoordinates);

}

当我编译时出现黑屏,这当然是因为我仍然缺少环境光和最后的光,为此我需要设置一个光源。

您可以定义的最简单的光源是定向光。对于定向光,您只需要一个包含光方向的 vec3。直接使用该光方向计算 Phong 照明模型。

注意您正在使用的特定方向向量 => 要么

  1. 用朝向光源的方向和朝向观察者的方向进行计算,或者
  2. 使用入射光方向和观察者朝向表面的方向执行计算

我之所以提到这一点,是因为如果你弄乱了方向,两个向量之间的点积(余弦)将为负数。

在执行光照计算时,确保所有数据都在同一 space 中非常重要。即,确保您的光线方向与您的顶点位置与您的 viewer/camera 位置相同 space。

space 的两个最明显的选择是:世界 space 和视图 space。如果你选择world space,你可以将viewer/camera的位置作为uniform传入,光线方向保持不变;如果您要查看视图 space,viewer/camera 将始终位于 (0,0,0),但您必须将每一帧中的光方向转换为视图 space -在您的情况下,如果您没有为场景使用非均匀缩放,则使用矩阵 mat3(viewMatrix) 应该可以解决问题。

一旦您成功计算了定向光的光照,您就可以继续使用其他光源,例如点光源,它们主要由位置向量定义(您再次从中计算每个顶点的方向向量).互联网上有很多关于这个主题的好教程。