Как использовать GL REPEAT, чтобы повторить только выбор атласа текстуры? (использование OpenGL)

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

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

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 и textureCoords собирается прошел диапазон [0,1]. Однако это не работает: (попытка повторить N = 10)

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

мы видим, что наш полный текстурный атлас повторяется...

как бы я сделал это правильно?

5 ответов


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

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

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

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


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

там могут быть расширения, чтобы справиться с этим, я не проверял.

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

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

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


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


хотя это может быть старая тема, вот как я в конечном итоге делают это:

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

Е. Г.: У меня есть лазерная текстура, содержащаяся в атласе большей текстуры, в U[0.05-0.1] & V[0.05-0.1].

затем я бы построил N сеток, каждая из которых имеет координаты U[0.05-0.1] & V[0.05-0.1]. (N = длина / текстура.высота; высота-размер текстуры I хотелось бы повторить. Или проще: количество раз, когда я хочу повторить текстуру.)

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

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


не может быть сделано...