Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
30.01.2015, 16:01     OpenGL ES 2.0 Тайлинг текстуры #1
Здравствуйте!
Имеется большая текстура, содержащая много маленьких... Таким образом, каждый спрайт показывает ее часть...
Не пойму как затайлить эту часть текстуры на спрайте, т.е. чтобы она повторилась на нем к примеру 4 раза.
Заранее спасибо!

Добавлено через 8 часов 56 минут
На данный момент придумал только увеличить число вершин, но мне кажется это костылем... Есть ли более рациональный способ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EVP
317 / 239 / 42
Регистрация: 14.12.2010
Сообщений: 460
30.01.2015, 17:31     OpenGL ES 2.0 Тайлинг текстуры #2
uv - координаты больше единицы (4,4) и включить повторение текстур.
Tiling a background in OpenGL.
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
30.01.2015, 22:01  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #3
Цитата Сообщение от EVP Посмотреть сообщение
uv - координаты больше единицы (4,4) и включить повторение текстур.
Это понятно) Не понятно как затайлить текстуру из атласа текстур... Я использую не всю текстуру, а лишь часть ее, и это часть нужно использовать как тайл... Я понимаю, что можно создать много спрайтов или один с большим количеством вершин... Но хотелось бы узнать если другой способ, чтобы оставить 4 вершины спрайта (ну, или 6, короче 2 треугольника)?
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
30.01.2015, 22:06  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #4
В общем художником мне не быть) Но вот постарался графически показать, что требуется.
OpenGL ES 2.0 Тайлинг текстуры
EVP
317 / 239 / 42
Регистрация: 14.12.2010
Сообщений: 460
31.01.2015, 12:52     OpenGL ES 2.0 Тайлинг текстуры #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].
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
31.01.2015, 18:01  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #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, чтобы работало отражение при тайлинге?
EVP
317 / 239 / 42
Регистрация: 14.12.2010
Сообщений: 460
31.01.2015, 20:12     OpenGL ES 2.0 Тайлинг текстуры #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. Там много примеров.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2015, 23:14     OpenGL ES 2.0 Тайлинг текстуры
Еще ссылки по теме:

OpenGl ES 2.0 Текстуры Android
Android Комбинирование 2D и 3D в OpenGL ES 2.0
Android Текстуры в GameActivity
Android LibGDX. TexturePacker. Не пакует текстуры
LibGDX вращение текстуры Android

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

Или воспользуйтесь поиском по форуму:
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
31.01.2015, 23:14  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #8
Спасибо за подробный ответ!

Цитата Сообщение от EVP Посмотреть сообщение
Условия в шейдере - зло
Согласен, но как иначе, не знаю...
Yandex
Объявления
31.01.2015, 23:14     OpenGL ES 2.0 Тайлинг текстуры
Ответ Создать тему
Опции темы

Текущее время: 15:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru