Python 灯光随摄像机位置移动

Python 灯光随摄像机位置移动,python,opengl,kivy,lighting,glsles,Python,Opengl,Kivy,Lighting,Glsles,我正在使用kivy实现一个简单的点光源渲染器,它具有多纹理和法线贴图。我的场景是一个简单的正方形,以我进行贴图的原点为中心。我有4张地图: 漫射反照率 镜面反照率 粗糙度图 法线映射 在我的python/kivy代码中,我将矩阵和其他制服设置如下: view_mat = Matrix().look_at(self.cam_pos*math.sin(self.cam_rot),0,self.cam_pos*math.cos(self.cam_rot),0.,0.,0.,0.,1.,0.) proj

我正在使用kivy实现一个简单的点光源渲染器,它具有多纹理和法线贴图。我的场景是一个简单的正方形,以我进行贴图的原点为中心。我有4张地图: 漫射反照率 镜面反照率 粗糙度图 法线映射

在我的python/kivy代码中,我将矩阵和其他制服设置如下:

view_mat = Matrix().look_at(self.cam_pos*math.sin(self.cam_rot),0,self.cam_pos*math.cos(self.cam_rot),0.,0.,0.,0.,1.,0.)
projection_mat = Matrix().view_clip(-width/height, width/height, -1., 1., 1., 10000., 1.)
light_pos = //can vary with keyboard input
model_mat = Matrix() (identity)
light_pos = (model_mat.multiply(view_mat)).normal_matrix() //Computes the inverse transpose of the upper left corner of the modelView matrix
对象上的法线设置为0,0,1,切线设置为1,0,0

我的片段着色器是:

void main() {

// Compute vertex eye space vertex, light and normal postion                                                                                                               
vec4 vertex_eye_space = view_mat * model_mat * vec4(v_pos, 1.0);
vec4 light_eye_space = view_mat * light_pos;
vec3 normal_eye_space = normalize((normal_mat * vec4(v_normal,0.0))).xyz;
vec3 tangent_eye_space = normalize((normal_mat * vec4(vec3(1.,0.,0.), 0.))).xyz;
vec3 bitangent_eye_space = normalize(cross(normal_eye_space, tangent_eye_space));
vec3 viewDirection_eye_space = normalize(-vertex_eye_space.xyz);

mat3 tbn_mat = mat3(tangent_eye_space, bitangent_eye_space, normal_eye_space);

viewDirection = normalize(tbn_mat * viewDirection_eye_space);
lightDirection = normalize(tbn_mat * (light_eye_space.xyz - vertex_eye_space.xyz));
vertexPosition = tbn_mat * vertex_eye_space.xyz;
texCoordinate = v_tc0;

vertex_normal = normal_eye_space;

gl_Position = projection_mat * vertex_eye_space;
}
以及关联的片段着色器:

void main() {

vec3 light_vector = normalize(lightDirection);
vec3 view_vector = normalize(viewDirection);

vec3 normal = normalize((texture2D(nmap, texCoordinate).rgb) * 2.0 - 1.0);
vec3 halfway_vector = normalize((light_vector + view_vector));

vec4 diff = pow(texture2D(diffuse, texCoordinate), vec4(2.2));

vec3 Diffuse = diff.xyz * clamp(dot(normal, light_vector), 0.0, 1.0);
gl_FragColor = vec4(Diffuse, 1.0);

}

现在,当我移动相机时,N.L值会发生变化,这毫无意义,我无法找出代码中的错误,尽管我花了几天时间调试它。

view\u mat随cam\u pos而变化,light\u pos随view\u mat而变化。我遗漏了什么吗?我不知道我明白你的意思。你能告诉我更多的细节吗;这是一个如何解决的问题?我定义了光在世界空间中的位置。眼睛空间=相机空间。一旦您的lightPos与viewMat相乘,它将成为您在眼睛空间中使用的名称。