2009-03-19 4 views
18

Как я могу повторить выбор текстурного атласа?Как использовать 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 
}; 

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

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

ответ

18

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

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

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

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

+0

Благодаря «расслабиться», «Jimmy J» и «TrayMan» за ваши вклады. Я проголосовал за ваши ответы и составил этот ответ от вас, который теперь очень хорошо описывает, что происходит. – Kriem

+2

> "или написать программу вершин GLSL, чтобы соответствующим образом отобразить координаты текстуры." Вместо этого должна быть * фрагмент *. –

+0

Это зависит, Sarge. Использование метода тесселяции более вершин, чем фрагмент. И вы обычно можете оптимизировать, не выполняя вычисления координат текстур в шейдере текстур - особенно с отложенным рендерингом на основе плитки. –

6

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

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

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

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

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

+0

Хм, GL_CLAMP, например, влияет на суб-текстур вы описываете, что привело меня к идее текстуры режим координат применяются к тем частям текстуры атлас. Или я здесь не так? (Конечно, видя, что я не могу повторить то, что я хотел бы, подразумевает, что я действительно ошибаюсь :)) – Kriem

-3

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

+8

Это ваш постоянный разговор о трубопроводе. – Kyle

5

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

1

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

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

E-mail: У меня есть лазерная текстура, содержащаяся в более крупном текстурном атласе, при 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)

+0

Интересно, тем не менее. Благодаря! :) – Kriem