Как использовать GL_REPEAT, чтобы повторять только выбор текстурного атласа? (OpenGL)
Как я могу повторить выбор атласа текстуры?
Например, мой спрайт (выбор) находится внутри координат текстуры:
GLfloat textureCoords[]=
{
.1f, .1f,
.3f, .1f,
.1f, .3f,
.3f, .3f
};
Затем я хочу повторить, что sprite 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
};
Мы видим, что наш полный текстурный атлас повторяется...
Как я сделал бы это правильно?
Ответы
Ответ 1
Это не может быть сделано так, как описано в вопросе. Режимы координат текстуры OpenGL применяются только для всей текстуры.
Обычно, чтобы повторить текстуру, вы нарисуете многоугольник, который "больше", чем предполагает ваша текстура. Например, если у вас была квадратная текстура, которую вы хотели повторить несколько раз (скажем, шесть) на большей площади, вы нарисуете прямоугольник, который в шесть раз шире, чем высокий. Затем вы должны установить координаты текстуры (0,0) - (6,1), а режим текстуры - "повторить". При интерполяции по многоугольнику координата текстуры, которая выходит за пределы 1, будет за счет повторения включения "обернуть" в текстуре, в результате чего текстура будет отображаться шесть раз по прямоугольнику.
Ни один из режимов обертки текстур не поддерживает тип операции, как описано в вопросе, т.е. все они отображаются в полный диапазон [0,1], а не какое-либо произвольное подмножество. когда вы текстурируете, используя только часть текстуры, нет способа указать эту большую координату текстуры таким образом, чтобы OpenGL повторял ее внутри только суб-прямоугольника.
У вас в основном есть два варианта: либо создайте новую текстуру, которая имеет только спрайт, который вам нужен из существующей текстуры, либо напишите программу вершин GLSL, чтобы соответствующим образом сопоставить координаты текстур.
Ответ 2
Я не уверен, что вы можете это сделать. Я думаю, что режимы координат текстур OpenGL применимы только для всей текстуры. При использовании атласа вы используете "суб-текстуры", так что ваши координаты текстуры никогда не приближаются к 0 и 1, нормальные пределы, в которых происходит обертывание и зажим.
Там могут быть расширения, чтобы справиться с этим, я не проверял.
EDIT: Обычно, чтобы повторить текстуру, вы нарисуете многоугольник, который "больше", чем подразумевает ваша текстура. Например, если у вас была квадратная текстура, которую вы хотели повторить несколько раз (скажем, шесть) на большей площади, вы нарисуете прямоугольник, который в шесть раз шире, чем высокий. Затем вы должны установить координаты текстуры (0,0) - (6,1), а режим текстуры - "повторить". При интерполяции по многоугольнику координата текстуры, которая выходит за пределы 1, будет за счет повторения включения "обернуть" в текстуре, в результате чего текстура будет отображаться шесть раз по прямоугольнику.
Это немного грубо, чтобы объяснить без изображений.
В любом случае, когда вы текстурируете, используя только часть текстуры, нет способа указать эту большую координату текстуры таким образом, чтобы OpenGL повторял ее внутри только суб-прямоугольника.
Ответ 3
Ни один из режимов обертки текстур не поддерживает тип операции, которую вы ищете, т.е. все они отображаются в полный диапазон [0,1], а не какое-либо произвольное подмножество. У вас в основном есть два варианта: либо создайте новую текстуру, которая имеет только спрайт, который вам нужен, из существующей текстуры, либо напишите программу пикселов GLSL, чтобы соответствующим образом сопоставить координаты текстуры.
Ответ 4
Хотя это может быть старая тема; вот как я это сделал:
Обходным путем было бы создание нескольких сеток, склеенных вместе, содержащих подмножество UV UV.
т.д.:
У меня есть лазерная текстура, содержащаяся в более крупном текстурном атласе при U [0,05-0,1] и V [0,05-0,1].
Тогда я бы построил N сеток, каждый из которых имел U [0,05-0,1] и V [0,05-0,1] координаты.
(N = length/texture.height; height - размер текстуры, которую я хотел бы повторить, или проще: количество раз, когда я хочу повторить текстуру.)
Это решение было бы более экономичным, чем перезагрузка текстуры после текстуры.
Особенно, если вы выполняете все вызовы рендеринга (как и должны).
(OpenGL ES 1.0.1.1.2.0 - Mobile Hardware 2011)
Ответ 5
Невозможно выполнить...