Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
#1

OpenGL ES 2.0 Тайлинг текстуры

30.01.2015, 16:01. Просмотров 759. Ответов 7
Метки нет (Все метки)

Здравствуйте!
Имеется большая текстура, содержащая много маленьких... Таким образом, каждый спрайт показывает ее часть...
Не пойму как затайлить эту часть текстуры на спрайте, т.е. чтобы она повторилась на нем к примеру 4 раза.
Заранее спасибо!

Добавлено через 8 часов 56 минут
На данный момент придумал только увеличить число вершин, но мне кажется это костылем... Есть ли более рациональный способ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2015, 16:01
Ответы с готовыми решениями:

OpenGl ES 2.0 Текстуры
Всем доброго вечера! Никак не получается по урокам отрисовать...

OpenGL наложение текстуры, падает приложение
после того как выполняю gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0,...

Простейший пример наложения текстуры Opengl ES
Подскажите простейший пример создания текстуры из картинки и наложения её на...

OpenGL тайлинг не отрабатывает как надо
Я пытаюсь затайлить текстуру 16x16 внутри региона 100x100. ...

Текстуры OpenGL
Подскажите пожалуйста как наложить текстуру на прямоугольник. Уже часов 5 ищу...

7
EVP
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 523
30.01.2015, 17:31 #2
uv - координаты больше единицы (4,4) и включить повторение текстур.
Tiling a background in OpenGL.
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
30.01.2015, 22:01  [ТС] #3
Цитата Сообщение от EVP Посмотреть сообщение
uv - координаты больше единицы (4,4) и включить повторение текстур.
Это понятно) Не понятно как затайлить текстуру из атласа текстур... Я использую не всю текстуру, а лишь часть ее, и это часть нужно использовать как тайл... Я понимаю, что можно создать много спрайтов или один с большим количеством вершин... Но хотелось бы узнать если другой способ, чтобы оставить 4 вершины спрайта (ну, или 6, короче 2 треугольника)?
0
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
30.01.2015, 22:06  [ТС] #4
В общем художником мне не быть) Но вот постарался графически показать, что требуется.
OpenGL ES 2.0 Тайлинг текстуры
0
EVP
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 523
31.01.2015, 12:52 #5
Цитата Сообщение от contedevel Посмотреть сообщение
Не понятно как затайлить текстуру из атласа текстур...
Да, невнимательно прочитал, виноват

Цитата Сообщение от contedevel Посмотреть сообщение
В общем художником мне не быть) Но вот постарался графически показать, что требуется.
Нужен шейдер, например такой:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uniform sampler2D baseMap;
uniform vec2 uv0;
uniform vec2 uv1;
uniform float tileCount;
 
varying vec2 Texcoord;
 
void main( void )
{
   vec2 delta = uv1 - uv0;
   vec2 uv = delta * Texcoord * tileCount;
   uv = mod(uv,delta);
   uv = uv + uv0;
   vec4 color = texture2D( baseMap, uv );
   gl_FragColor = color;
}
uv0 - начальные координаты спрайта в атласе, (0.2,0.2) например.
uv1 - конечные координаты спрайта в атласе, (0.6,0.6) например.
tileCount - количество повторение участка спрайта, (4) например.
Texcoord - в пределах [0,1].
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
31.01.2015, 18:01  [ТС] #6
Цитата Сообщение от EVP Посмотреть сообщение
Нужен шейдер, например такой:
Спасибо Вам большое, получилось все!

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

Добавлено через 2 часа 57 минут
Цитата Сообщение от EVP Посмотреть сообщение
Нужен шейдер, например такой:
Никак не получается реализовать тайлинг с отражением:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
precision mediump float;
 
uniform sampler2D sTexture;
uniform vec2 uv0;
uniform vec2 uv1;
uniform vec2 vTileCount;
uniform int iMode;
 
varying vec2 vTextureCoordinates;
 
vec4 singleMode();
vec4 repeatMode();
vec4 mirrorMode();
 
void main( void ) {
     if(iMode == 0) {
           gl_FragColor = texture2D(sTexture, vTextureCoordinates);
     } else if(iMode == 1) {
           gl_FragColor = singleMode();
     } else if(iMode == 2) {
           gl_FragColor = repeatMode();
     } else {
           gl_FragColor = mirrorMode();
     }
}
 
vec4 singleMode() {
     vec2 uv = vTextureCoordinates;
     if(uv.x < uv0.x)
           uv.x = uv0.x;
     else if(uv.x > uv1.x)
           uv.x = uv1.x;
 
     if(uv.y < uv0.y)
                uv.y = uv0.y;
     else if(uv.y > uv1.y)
                uv.y = uv1.y;
     return texture2D(sTexture, uv);
}
 
vec4 repeatMode() {
     vec2 delta = uv1 - uv0;
     vec2 uv = delta * vTextureCoordinates * vTileCount;
     uv = mod(uv, delta);
     uv = uv + uv0;
     return texture2D(sTexture, uv);
}
 
vec4 mirrorMode() {
     vec2 delta = uv1 - uv0;
     vec2 uv = delta * vTextureCoordinates * vTileCount;
     uv = mod(uv, delta);
     uv = uv + uv0;
     return texture2D(sTexture, uv);
}


Как изменить функцию mirrorMode, чтобы работало отражение при тайлинге?
0
EVP
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 523
31.01.2015, 20:12 #7
Цитата Сообщение от contedevel Посмотреть сообщение
Как изменить функцию mirrorMode, чтобы работало отражение при тайлинге?
Немного посложнее, например так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uniform sampler2D baseMap;
uniform vec2 uv0;
uniform vec2 uv1;
uniform float tileCount;
 
varying vec2 Texcoord;
 
void main( void )
{
   vec2 delta = uv1 - uv0;
   
   vec2 uv = delta * Texcoord * tileCount;
   vec2 tile = mod(floor(uv/delta),vec2(2,2));
   
   uv = mod(uv,delta);
   vec2 uvInverse = delta-uv;
   
   uv = mix(uv,uvInverse,ceil(tile/2));
   
   uv = uv + uv0;
   vec4 color = texture2D( baseMap, uv );
   gl_FragColor = color;
}
Условия в шейдере - зло

Добавлено через 18 минут
Цитата Сообщение от contedevel Посмотреть сообщение
как реализовывать наложение текстур в шейдере?
Добавить второй sampler2D и его миксовать с основным (складывать цвета по какому либо алгоритму).
Использовать либо одни и те же текстурные координаты, либо ввести дополнительные.

Добавлено через 3 минуты
Советую познакомиться с Render Monkey. Там много примеров.
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
31.01.2015, 23:14  [ТС] #8
Спасибо за подробный ответ!

Цитата Сообщение от EVP Посмотреть сообщение
Условия в шейдере - зло
Согласен, но как иначе, не знаю...
0
31.01.2015, 23:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2015, 23:14

текстуры в OpenGl
народ, кто работал с OpenGl помогите плиз, срочно надо....Возникла проблема...

Текстуры OpenGL
Здравствуйте, изучаю OpenGL через Glut и интересует вопрос наложения текстур...

Текстуры в OpenGl
Всем привет. Подскажите пожалуйста, как наложить текстуры сразу на все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru