如何为 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 照明模型。
注意您正在使用的特定方向向量 => 要么
- 用朝向光源的方向和朝向观察者的方向进行计算,或者
- 使用入射光方向和观察者朝向表面的方向执行计算
我之所以提到这一点,是因为如果你弄乱了方向,两个向量之间的点积(余弦)将为负数。
在执行光照计算时,确保所有数据都在同一 space 中非常重要。即,确保您的光线方向与您的顶点位置与您的 viewer/camera 位置相同 space。
space 的两个最明显的选择是:世界 space 和视图 space。如果你选择world space,你可以将viewer/camera的位置作为uniform传入,光线方向保持不变;如果您要查看视图 space,viewer/camera 将始终位于 (0,0,0),但您必须将每一帧中的光方向转换为视图 space -在您的情况下,如果您没有为场景使用非均匀缩放,则使用矩阵 mat3(viewMatrix)
应该可以解决问题。
一旦您成功计算了定向光的光照,您就可以继续使用其他光源,例如点光源,它们主要由位置向量定义(您再次从中计算每个顶点的方向向量).互联网上有很多关于这个主题的好教程。
我正在尝试实现 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 照明模型。
注意您正在使用的特定方向向量 => 要么
- 用朝向光源的方向和朝向观察者的方向进行计算,或者
- 使用入射光方向和观察者朝向表面的方向执行计算
我之所以提到这一点,是因为如果你弄乱了方向,两个向量之间的点积(余弦)将为负数。
在执行光照计算时,确保所有数据都在同一 space 中非常重要。即,确保您的光线方向与您的顶点位置与您的 viewer/camera 位置相同 space。
space 的两个最明显的选择是:世界 space 和视图 space。如果你选择world space,你可以将viewer/camera的位置作为uniform传入,光线方向保持不变;如果您要查看视图 space,viewer/camera 将始终位于 (0,0,0),但您必须将每一帧中的光方向转换为视图 space -在您的情况下,如果您没有为场景使用非均匀缩放,则使用矩阵 mat3(viewMatrix)
应该可以解决问题。
一旦您成功计算了定向光的光照,您就可以继续使用其他光源,例如点光源,它们主要由位置向量定义(您再次从中计算每个顶点的方向向量).互联网上有很多关于这个主题的好教程。