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

Posted

技术标签:

【中文标题】如何为 Phong 着色实现选择光源?【英文标题】:How to pick light source for Phong shading implementation? 【发布时间】:2018-12-29 17:30:26 【问题描述】:

我正在尝试实现 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);


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

【问题讨论】:

" 我黑屏,这当然是因为我仍然缺少环境光和最终光" - 你会黑屏,因为什么都没有在片段着色器中分配给out pixelColor 一般光源有方向灯和点光源。定向灯只是一个方向vec3,光线来自与光源无限远的距离(通常用于太阳)。点光源是世界上的位置(vec3 也是),光线从这里发射到各个方向。聚光灯通过一个方向和一个角度将一个点光源缩小为一个圆锥体。 @Rabbid76 非常感谢您的解释! 【参考方案1】:

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

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

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

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

在执行光照计算时,确保所有数据都在同一个空间中非常重要。即,确保您的光线方向与您的顶点位置与您的查看器/相机位置处于同一空间中。

空间的两个最明显的选择是:世界空间和视图空间。如果您选择世界空间,您可以将观察者/相机的位置作为统一传递,并且光线方向将保持不变;如果您要查看视图空间,则查看器/相机将始终位于 (0,0,0),但您必须将每一帧中的光线方向转换为视图空间 - 在您的情况下,使用矩阵 mat3(viewMatrix) 应该如果你没有为你的场景使用非均匀缩放,那就去做吧。

成功计算定向光源的照明后,您可以继续使用其他光源,例如点光源,这些光源主要由位置矢量定义(再次,您可以从中计算每个顶点的方向矢量)。网上有很多关于这个话题的好教程。

【讨论】:

非常感谢您的详细解释!它真的帮了我很多

以上是关于如何为 Phong 着色实现选择光源?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Blinn-Phong GLSL 着色器、点光源的奇怪结果

基于Qt的OpenGL可编程管线学习- 方向光点光源phongblin-phong

WebGL三维模型实现Phong着色(WebGL进阶05)

Phong 着色器不起作用

如何在 OpenGL 中为 Phong 着色插入法线?

在我的着色器中实现 phong 着色(过度纹理)的错误