我正在尝试实现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照明模型。
当心您正在使用的特定方向向量=>
以朝向光源的方向和朝向观察者的方向执行计算,或者
使用入射光方向和从观察者到地面的方向执行计算
我之所以这样说是因为,如果您弄乱了方向,则两个向量之间的点积(余弦)将为负。
执行照明计算时,确保所有数据都在同一空间中非常重要。也就是说,请确保您的灯光方向与顶点位置与查看器/相机位置位于相同的空间。
空间的两个最明显的选择是:世界空间和视图空间。如果选择世界空间,则可以均匀地通过观察者/摄像机的位置,并且光的方向将保持不变。如果您要使用视图空间,则查看器/相机始终处于(0,0,0),但是必须将每一帧的光方向转换为视图空间-在这种情况下,使用矩阵mat3(viewMatrix)
应该如果您不对场景使用非均匀缩放,请执行此技巧。
成功计算出定向光的照度后,您可以继续使用其他光源,例如点光源,这些光源主要由位置矢量定义(从该位置矢量,您再一次计算每个顶点的方向矢量)。互联网上有很多关于此主题的优秀教程。