#opengl #perspectivecamera
#opengl #перспективная камера
Вопрос:
Что я делаю в вершинном шейдере, так это:
shadowCoord = shadowVP * mMatrix * vec4(vertex_position,1.0);
Теперь, чтобы вернуть его в диапазон [-1, 1], я сделал это в шейдере фрагментов:
vec3 proj = shadowCoord.xyz / shadowCoord.w;
Но если я проверю значение z такой точки, я получу значение больше 1.
Перспективная матрица, которую я использую, получается с помощью:
glm::perspective(FOV, aspectRatio, near, far);
И это приводит к:
[2.4142 0 0 0
0 2.4142 0 0
0 0 -1.02 -1
0 0 -0.202 0]
и shadowVP равен:
shadow_Perp * shadow_View
Не proj.z
должно быть в диапазоне [-1,1]?
Комментарии:
1. Нет, для этого потребуется зажим. Это все равно приведет к результатам за пределами этого диапазона, вам нужно либо решить их закрепить (как это можно сделать с координатами текстуры), либо обрезать их (как это можно сделать с вершинами).
2. @AndonM. Coleman Извините, но я не уверен, что понял. При условии, что я полностью понял проблему, на которую указал дерхасс, в случае, когда точка лежит в усеченном, разве перспективное умножение деление на w автоматически не делает каждое значение между [-1; 1] ? Или вы хотите сказать, что если я должен сделать clip / clamp, чтобы рассмотреть случай с усечением?
3. Нет, если вы этого не понимаете, то вы на самом деле тоже не понимаете, о чем говорил Дерхасс. Деление на
w
все еще может приводить к значениям за пределами диапазона [ -1 , 1 ], эти точки находятся за пределами вашего объема просмотра. Когда это деление выполняется фактическим графическим оборудованием перед преобразованием в пространство NDC, точки с координатами> w или < -w обрезаются. Это не то, что происходит автоматически, и когда вы сами выполняете деление, он игнорирует этот факт, поэтому у вас все еще могут быть точки за пределами этого диапазона после деления.4. В случае проективных текстурных координат, которые вы на самом деле используете здесь, GL фактически обрабатывает координаты вне диапазона [ 0.0 , 1.0 ] для вас, используя свое состояние переноса текстуры. Значение по умолчанию равно
GL_REPEAT
, что означает, что -1 становится 0 , а -0.1 становится 0.9 . Даже если вы выйдете за пределы этого диапазона, он работает так же — -33.0 становится 0.0 , а -33.1 становится 0.9 . Входные координаты не обязательно должны находиться в определенном диапазоне, выборка текстур позаботится об этом за вас.
Ответ №1:
Не
proj.z
должно быть в диапазоне [-1,1]?
Нет. Оно находится в диапазоне [-1,1], если точка лежит внутри усеченного конуса. И усеченное значение определяется как -w <= x,y,z <= w
для любого vetrex в пространстве клипа (и это w
зависит от вершины). Но вы не выполняете никакого отсечения, поэтому здесь может получиться любое значение. Обратите внимание на две вещи:
-
Хотя я сказал, что значение «
v
внутри усечения» => «Координаты NDC в [-1,1]» справедливо, обратное — нет. Это означает, что вы можете получить координаты NDC внутри [-1,1] для точек, которые лежат за пределами frusutm (которые могут даже находиться за «позицией просмотра»). -
Здесь вы также можете получить деление на 0.