Подтвердить что ты не робот

Как использовать 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
};

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

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

4b9b3361

Ответ 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

Невозможно выполнить...