Как выбрать источник света для реализации затенения Фонг? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь реализовать модель затенения Фонга, и я не уверен, как выбрать источник света.Точнее, я не понимаю, как должен выглядеть источник света.Должно ли это быть 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 Ответ

0 голосов
/ 29 декабря 2018

Самый простой источник света, который вы можете определить, - это направленный свет.Для направленного света все, что вам нужно, это vec3, который содержит направление света.Используйте это направление света непосредственно при расчете модели освещения Фонга.

Остерегайтесь используемых векторов направления = = либо либо

  1. выполните вычисления с направлением на источник света и направлением на зрителя, либо
  2. выполнить вычисления с направлением входящего света и направлением от зрителя к поверхности

Я упоминаю об этом, потому что, если вы перепутаете направления, ваш точечный продукт (косинус) между двумя векторамибудет отрицательным.

Очень важно убедиться, что все ваши данные находятся в одном и том же месте при выполнении расчета освещенности.То есть, убедитесь, что ваше направление света находится в том же пространстве, что и положение вершины, и положение вашего наблюдателя / камеры.

Два наиболее очевидных варианта для этих пространств: мировое пространство и пространство обзора.Если вы выберете мировое пространство, вы можете перейти в положение зрителя / камеры как единое целое, и направление света останется прежним;если вы собираетесь в пространство просмотра, зритель / камера будут всегда в (0,0,0), но вы должны преобразовать направление света в каждом кадре в пространство просмотра - в вашем случае, используя матрицу mat3(viewMatrix), следуетсделайте трюк, если вы не используете неравномерное масштабирование для вашей сцены.

После того, как вы успешно рассчитали освещенность для направленного света, вы можете перейти к другим источникам света, таким как точечные источники света, которые в основном определяютсяпо вектору положения (из которого вы снова вычисляете вектор направления для каждой вершины).В интернете есть много хороших учебников по этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...