Некорректное отображение текстуры на вертикальной плоскости в OpenGL - PullRequest
0 голосов
/ 06 марта 2019

Работаем над приложением AR и пытаемся заменить текстуру самолета.

Я пытаюсь визуализировать текстуру на вертикальной и горизонтальной плоскостях. Он хорошо работает для горизонтальных плоскостей, но не работает хорошо для вертикальных.

enter image description here

Я обнаружил, что что-то не так с texture_coord вычислениями, но не могу понять (плохо знаком с OpenGL).

Вот мой вершинный шейдер

void main()
{
    vec4 local_pos = vec4(a_position, 1.0);
    vec4 world_pos = u_model * local_pos;

    texture_coord = world_pos.sp * u_scale;

    gl_Position = u_mvp * local_pos;
}

фрагментный шейдер

out vec4 outColor;

void main()
{
    vec4 control = texture(u_texture, diffuse_coord);

    float dotScale = 1.0;

    float lineFade = 0.5;

    vec3 newColor = (control.r * dotScale > u_gridControl.x) ? u_dotColor.rgb : control.g > u_gridControl.y ? u_lineColor.rgb * lineFade: u_lineColor.rgb * 0.25 * lineFade;

    outColor = vec4(newColor, 1.0);
}

1 Ответ

1 голос
/ 07 марта 2019

В вашем вершинном шейдере важен бит texture_coord = world_pos.sp.

Существует три способа обращения к компонентам вектора в GLSL.xyzw (наиболее распространенный), rgba (более естественный для цветов), stpq (более естественный для координат текстуры).

Линия texture_coord = world_pos.sp была бы более понятной, если бы она была записана как texture_coord = world_pos.xz.

Как только вы осознаете, что генерируете текстурные координаты, игнорируя компонент y, становится очевидным, почему вертикальные плоскости не текстурированы так, как вам бы хотелось.

К сожалению, не существует простой одной линииисправить.Возможно, трехплоскостное текстурирование может быть подходящим решением для вас - этот кажется хорошим объяснением техники.

...