Значение Z больше 1 после w деления

#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 зависит от вершины). Но вы не выполняете никакого отсечения, поэтому здесь может получиться любое значение. Обратите внимание на две вещи:

  1. Хотя я сказал, что значение « v внутри усечения» => «Координаты NDC в [-1,1]» справедливо, обратное — нет. Это означает, что вы можете получить координаты NDC внутри [-1,1] для точек, которые лежат за пределами frusutm (которые могут даже находиться за «позицией просмотра»).

  2. Здесь вы также можете получить деление на 0.