Отображение параллакса — работает только в одном направлении

Я работаю над картированием параллакса (из этого урока: http://sunandblackcat.com/tipFullView.php?topicid=28) и я, кажется, получаю хорошие результаты, только когда я двигаюсь вдоль одной оси (например, слева направо), глядя на параллаксированный квад. Изображение ниже иллюстрирует это:

неверное отображение параллакса

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

Я использую самую простую форму отображения параллакса, и даже у нее те же проблемы. Фрагмент шейдера выглядит так:

void main()
{
vec2 texCoords = fs_in.TexCoords;
vec3 viewDir = normalize(viewPos - fs_in.FragPos);
vec3 V = normalize(fs_in.TBN * viewDir);
vec3 L = normalize(fs_in.TBN * lightDir);float height = texture(texture_height, texCoords).r;
float scale = 0.2;
vec2 texCoordsOffset = scale * V.xy * height;

texCoords += texCoordsOffset;

// calculate diffuse lighting
vec3 N = texture(texture_normal, texCoords).rgb * 2.0 - 1.0;
N = normalize(N); // normal already in tangent-space
vec3 ambient = vec3(0.2f);
float diff = clamp(dot(N, L), 0, 1);
vec3 diffuse = texture(texture_diffuse, texCoords).rgb * diff;
vec3 R = reflect(L, N);
float spec = pow(max(dot(R, V), 0.0), 32);
vec3 specular = vec3(spec);
fragColor = vec4(ambient + diffuse + specular, 1.0);
}

Матрица TBN создается в вершинном шейдере следующим образом:

vs_out.TBN = transpose(mat3(normalize(tangent), normalize(bitangent), normalize(vs_out.Normal)));

Я использую транспонирование TBN для преобразования всех соответствующих векторов в касательное пространство. Без смещения TexCoords, освещение выглядит хорошо с нормальной отображенной текстурой, поэтому я предполагаю, что проблема не в матрице TBN. Что может быть причиной того, что это работает только в одном направлении?

редактировать

Интересно, что если я инвертирую координату у TexCoords Отображение параллакса входной переменной, кажется, работает. Я понятия не имею, почему это работает, и мне нужно, чтобы это работало без инверсии.

vec2 texCoords = vec2(fs_in.TexCoords.x, 1.0 - fs_in.TexCoords.y);

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]