Как выбрать источник света для реализации затенения Фонг?
Я пытаюсь реализовать модель затенения Фонга и не знаю, как выбрать источник света. Точнее, я не понимаю, как должен выглядеть источник света. Должно ли это быть 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);
}
Когда я компилирую, я получаю черный экран, который, конечно, происходит, потому что я все еще пропускаю окружающий свет и выходящий последний свет, для которого мне нужно установить источник света.
1 ответ
Самый простой источник света, который вы можете определить, - это направленный свет. Для направленного света все, что вам нужно, это vec3, который содержит направление света. Используйте это направление света непосредственно при расчете модели освещения Фонга.
Остерегайтесь конкретных векторов направления, которые вы используете => либо
- выполнить расчеты с направлением на источник света и направлением на зрителя, или
- выполнять расчеты с направлением входящего света и направлением от зрителя к поверхности
Я упоминаю об этом, потому что если вы перепутаете направления, ваше скалярное произведение (косинус) между двумя векторами будет отрицательным.
При выполнении расчета освещенности очень важно убедиться, что все ваши данные находятся в одном и том же месте. Т.е. убедитесь, что ваше направление света находится в том же пространстве, что и положение вершины, и положение вашего наблюдателя / камеры.
Два наиболее очевидных выбора для пространств: мировое пространство и обзорное пространство. Если вы выберете мировое пространство, вы можете перейти в положение зрителя / камеры как единое целое, и направление света останется прежним; если вы собираетесь в пространство просмотра, зритель / камера будут всегда в (0,0,0), но вы должны преобразовать направление света в каждом кадре в пространство просмотра - в вашем случае, используя матрицу mat3(viewMatrix)
должен сделать свое дело, если вы не используете неравномерное масштабирование для вашей сцены.
После того, как вы успешно рассчитали освещение для направленного света, вы можете перейти к другим источникам света, таким как точечные источники света, которые в основном определяются вектором положения (из которого вы снова рассчитываете вектор направления для каждой вершины). Есть много хороших учебных пособий по этой теме в Интернете.