我试图实现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);
}当我编译时,我会得到一个黑色的屏幕,当然,这是因为我仍然错过了周围的光线和最后的光线,为此我需要设置一个光源。
发布于 2018-12-29 17:48:10
你可以定义的最简单的光源是定向光源。对于一个方向光,你所需要的是一个vec3,它包含光的方向。直接用该光方向计算Phong照明模型。
也要注意使用=>的特定方向向量
我之所以提到这一点,是因为如果你搞砸了方向,两个向量之间的点积(余弦)将是负的。
在执行光照计算时,确保所有数据都在同一个空间中是非常重要的。也就是说,确保你的光的方向和你的顶点位置和你的观看者/摄像机的位置是相同的。
空间最明显的两个选择是:世界空间和视野空间。如果你选择世界空间,你可以把观看者/摄像机的位置作为制服,光线的方向保持不变;如果你要去观看空间,观众/摄像机将始终在(0,0,0),但你必须将每一帧的光方向转换成视场空间--在你的情况下,使用矩阵mat3(viewMatrix)应该能做到这一点,如果你不对场景使用非均匀缩放的话。
一旦您成功地计算了定向光的照明,您就可以继续使用其他光源,如点灯,这些光源主要由位置矢量定义(您也可以从位置矢量中计算每个顶点的方向矢量)。在互联网上有很多关于这个话题的好教程。
https://stackoverflow.com/questions/53971799
复制相似问题