"."
обычно не соответствует разрыву строки. Большинство движков регулярных выражений позволяют вам добавить флагов S
(также называемый DOTALL
и SINGLELINE
), чтобы "."
также соответствовал символам новой строки. Если это не удается, вы можете сделать что-то вроде [\S\s]
.
eye_pos
- это позиция в мировом пространстве.
o_pos
- это позиция в пространстве просмотра, пространстве клипа и нормализованном пространстве устройства. Это все то же самое в вашем случае, потому что у вас нет матрицы проекции, и атрибут координаты вершины напрямую назначается позиции пространства клипа в вершинном шейдере:
blockquote> [ 1114] В любом случае, не имеет смысла вычислять вектор из положения в мировом пространстве в положение в пространстве вида, как вы это делаете:gl_Position = vec4(aPos, 1.0);
blockquote>vec3 incident = normalize(o_pos - eye_pos);
Положение глаза в поле зрения есть (0, 0, 0). Таким образом, вектор вида инцидента в пространстве вида:
vec3 incident = normalize(o_pos - vec3(0.0, 0.0, 0.0));
Этот вектор должен быть преобразован из пространства вида в мировое пространство, что может быть достигнуто с помощью матрицы ориентации вида (
mat3(view_right, view_up, view_forward)
), в так же, как вы делаете это в фрагментном шейдере скайбокса:vec3 incident = mat3(view_right, view_up, view_forward) * normalize(o_pos);
Нормальный вектор
o_normal
также является вектором пространства просмотра. Поэтому его необходимо преобразовать в мировое пространство:vec3 wordlNormal = mat3(view_right, view_up, view_forward) * normalize(o_normal);
Вместо преобразования вектора падения и вектора нормали можно преобразовать результирующий вектор после отражения.
Вы должны изменить шейдер фрагмента объекта, чтобы решить вашу проблему:#version 330 core in vec3 o_pos; in vec3 o_normal; out vec4 fragColor; uniform vec3 view_up; uniform vec3 view_right; uniform vec3 view_forward; uniform samplerCube cubeTex; void main() { mat3 invNormalM = mat3(view_right, view_up, view_forward); vec3 viewIncident = normalize(o_pos); vec3 viewNormal = normalize(o_normal); vec3 worldReflection = invNormalM * reflect(viewIncident, viewNormal); fragColor = vec4(texture(cubeTex, worldReflection).rgb, 1.0); }
Я передаю матрицу вида непосредственно в шейдер фрагмента.
blockquote>
mat3(view_right, view_up, view_forward)
не является матрицей вида. Это матрица ориентации камеры. Так что это обратная (нормальная) матрица.