Parallax / Relief / Height mapping для текстур со свойством GL_REPEAT

Разные виды маппинга в основном для оптимизации полигонов, например что-бы за рендерить огромную кирпичную стену из 4 текстур (tex, norm, rough, height). Так вот, есть механика Parallax mapping (в дальнейшем буду её называть так), которая заключается в пускании луча из камеры в пространстве полигона, с дальнейшей проверкой коллизии с глубиной текстуры и нахождением вектора от XY камеры и проекции луча на плоскость, этот вектор будет служить смещением для UV-координаты. Такой подход создаёт иллюзию 3Д. Моя проблема заключается в том, что если не обрезать такую текстуру по краям, то она будет уходить в бесконечность (если смотреть на текстуру горизонтально, то её 3Д принт странно будет уходить за край полигона, это выглядит, как-будто полигон - это люк в подвал, а текстура в нём - это его содержимое). Обычно для решения этой проблемы используют

if (uv.x<0||uv.x>1||uv.y<0||uv.y>1) discard;

Она не отрисовывает пиксели с uv-координатой вне диапазона [0;1]

Однако в моём случае используются текстуры с параметром GL_REPEAT, что означает если x или y выходят за рамки [0;1], то они игнорируют целое число (то-есть пиксель с UV (5.43;-0.26) будет отрисовыватся как (0.43;0.74)). Код выше просто обрезает часть, которая должна повторятся, а мне надо, что-бы оно обрезало на границах полигона.

У меня есть идея, что надо как-то передать все uv координаты полигона в шейдер (либо массивом, либо получить их как-то из других шейдеров), передав тем самым uv развёртку, и дальше по простому алгоритму SAT понять, находится-ли uv координата в рамках этой развёртки.

Я не могу представить свой код, так-как на данный день/час не имею проекта на руках, но решение лучше найти заранее


Ответы (0 шт):