Я переключаю свои шейдеры с использования конвейера с фиксированными функциями OpenGL. Раньше OpenGL автоматически преобразовывал огни для меня, но теперь мне нужно сделать это самому.
В моем вершинном шейдере есть следующий код GLSL:
//compute all of the light vectors. we want normalized vectors
//from the vertex towards the light
for(int i=0;i < NUM_LIGHTS; i++)
{
//if w is 0, it's a directional light, it is a vector
//pointing from the world towards the light source
if(u_lightPos[i].w == 0)
{
vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));
v_lightDir[i] = transformedLight;
}
else
{
//this is a positional light, transform it by the view*projection matrix
vec4 transformedLight = u_vp_matrix * u_lightPos[i];
//subtract the vertex from the light to get a vector from the vertex to the light
v_lightDir[i] = normalize(vec3(transformedLight - gl_Position));
}
}
Что мне заменить ??? со строкой vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));
?
У меня уже есть следующие матрицы в качестве входных данных:
uniform mat4 u_mvp_matrix;//model matrix*view matrix*projection matrix
uniform mat4 u_vp_matrix;//view matrix*projection matrix
uniform mat3 u_normal_matrix;//normal matrix for this model
Не думаю, что это что-то из этого. Очевидно, это не матрица mvp или нормальная матрица, потому что они специфичны для текущей модели, и я пытаюсь преобразовать ее для просмотра координат. Однако я не думаю, что это матрица vp, потому что она включает переводы, и я не хочу переводить вектор.
Могу ли я вычислить необходимую мне матрицу из того, что в данный момент передается шейдеру, и если да, что мне нужно вычислить? Если нет, какую матрицу мне нужно добавить и как ее вычислять?