Как использовать GL_REPEAT для повторения только выделенного фрагмента атласа текстур?(ОпенГЛ)

StackOverflow https://stackoverflow.com/questions/662107

Вопрос

Как я могу повторить выбор атласа текстур?

Например, мой спрайт (выделение) находится в пределах координат текстуры:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

Затем я хочу повторить этот спрайт N раз к треугольной полосе (или четырехугольнику), определяемой следующим образом:

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

Я знаю, что это как-то связано с GL_REPEAT и текстурные координаты прошли диапазон [0,1].Однако это не работает:(пытаюсь повторить N = 10)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

Мы видим повторение нашего полного атласа текстур...

Как мне сделать это правильно?

Это было полезно?

Решение

Это невозможно сделать так, как описано в вопросе.Режимы координат текстуры OpenGL применяются только ко всей текстуре.

Обычно, чтобы повторить текстуру, вы должны нарисовать многоугольник, который «больше», чем предполагает ваша текстура.Например, если у вас есть квадратная текстура, которую вы хотите повторить несколько раз (скажем, шесть) на большей площади, вы должны нарисовать прямоугольник, ширина которого в шесть раз превышает высоту.Затем вы установите координаты текстуры (0,0)-(6,1), а режим текстуры - «повторение».При интерполяции по многоугольнику координата текстуры, выходящая за пределы 1, из-за включенного повтора будет «обтекать» текстуру, в результате чего текстура будет отображаться шесть раз по прямоугольнику.

Ни один из режимов переноса текстур не поддерживает операцию, описанную в вопросе, т.е.все они соответствуют полному диапазону [0,1], а не какому-то произвольному подмножеству.когда вы текстурируете, используя только часть текстуры, нет способа указать эту большую координату текстуры таким образом, чтобы OpenGL повторял ее только внутри субпрямоугольника.

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

Другие советы

Я не уверен, что ты сможешь это сделать.Я думаю, что режимы координат текстуры OpenGL применимы только ко всей текстуре.При использовании атласа вы используете «подтекстуры», так что координаты вашей текстуры никогда не приближаются к 0 и 1, нормальным пределам, при которых происходит перенос и зажим.

Возможно, есть расширения для решения этой проблемы, я не проверял.

РЕДАКТИРОВАТЬ:Обычно, чтобы повторить текстуру, вы должны нарисовать многоугольник, который «больше», чем предполагает ваша текстура.Например, если у вас есть квадратная текстура, которую вы хотите повторить несколько раз (скажем, шесть) на большей площади, вы должны нарисовать прямоугольник, ширина которого в шесть раз превышает высоту.Затем вы установите координаты текстуры (0,0)-(6,1), а режим текстуры - «повторение».При интерполяции по многоугольнику координата текстуры, выходящая за пределы 1, из-за включенного повтора будет «обтекать» текстуру, в результате чего текстура будет отображаться шесть раз по прямоугольнику.

Это немного грубовато объяснять без изображений.

В любом случае, когда вы текстурируете, используя только часть текстуры, нет способа указать эту большую координату текстуры таким образом, чтобы OpenGL повторял ее только внутри субпрямоугольника.

Ни один из режимов наложения текстур не поддерживает тот тип операции, который вам нужен, т.е.все они соответствуют полному диапазону [0,1], а не какому-то произвольному подмножеству.По сути, у вас есть два варианта:Либо создайте новую текстуру, содержащую только нужный вам спрайт из существующей текстуры, либо напишите пиксельную программу GLSL для соответствующего сопоставления координат текстуры.

Хотя это может быть старая тема;вот как я это сделал:

Обходным решением было бы создание нескольких склеенных друг с другом сеток, содержащих подмножество UV-текстур.

Например.:У меня есть лазерная текстура, содержащаяся в более крупном атласе текстур, с U[0,05–0,1] и V[0,05–0,1].

Затем я бы построил N сеток, каждая из которых имела координаты U[0,05-0,1] и V[0,05-0,1].(N = длина/текстура.высота;высота — это размер текстуры, которую я хотел бы повторить.Или проще:количество раз, которое я хочу повторить текстуру.)

Это решение будет более экономичным, чем необходимость перезагружать текстуру за текстурой.Особенно, если вы пакетируете все вызовы рендеринга (как и должно быть).

(OpenGL ES 1.0,1.1,2.0 — мобильное оборудование 2011 г.)

Невозможно сделать...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top