Отражение OpenGL неправильно отображает скайбокс

"." обычно не соответствует разрыву строки. Большинство движков регулярных выражений позволяют вам добавить флагов S (также называемый DOTALL и SINGLELINE), чтобы "." также соответствовал символам новой строки. Если это не удается, вы можете сделать что-то вроде [\S\s].

1
задан Rabbid76 3 March 2019 в 12:26
поделиться

1 ответ

eye_pos - это позиция в мировом пространстве.
o_pos - это позиция в пространстве просмотра, пространстве клипа и нормализованном пространстве устройства. Это все то же самое в вашем случае, потому что у вас нет матрицы проекции, и атрибут координаты вершины напрямую назначается позиции пространства клипа в вершинном шейдере:

 gl_Position = vec4(aPos, 1.0);
[ 1114] В любом случае, не имеет смысла вычислять вектор из положения в мировом пространстве в положение в пространстве вида, как вы это делаете:

 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);
}

Я передаю матрицу вида непосредственно в шейдер фрагмента.

mat3(view_right, view_up, view_forward) не является матрицей вида. Это матрица ориентации камеры. Так что это обратная (нормальная) матрица.

0
ответ дан Rabbid76 3 March 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: