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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
#1

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

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

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

Добавлено через 8 часов 56 минут
На данный момент придумал только увеличить число вершин, но мне кажется это костылем... Есть ли более рациональный способ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EVP
321 / 243 / 43
Регистрация: 14.12.2010
Сообщений: 462
30.01.2015, 17:31     OpenGL ES 2.0 Тайлинг текстуры #2
uv - координаты больше единицы (4,4) и включить повторение текстур.
Tiling a background in OpenGL.
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
30.01.2015, 22:01  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #3
Цитата Сообщение от EVP Посмотреть сообщение
uv - координаты больше единицы (4,4) и включить повторение текстур.
Это понятно) Не понятно как затайлить текстуру из атласа текстур... Я использую не всю текстуру, а лишь часть ее, и это часть нужно использовать как тайл... Я понимаю, что можно создать много спрайтов или один с большим количеством вершин... Но хотелось бы узнать если другой способ, чтобы оставить 4 вершины спрайта (ну, или 6, короче 2 треугольника)?
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
30.01.2015, 22:06  [ТС]     OpenGL ES 2.0 Тайлинг текстуры #4
В общем художником мне не быть) Но вот постарался графически показать, что требуется.
OpenGL ES 2.0 Тайлинг текстуры
EVP
321 / 243 / 43
Регистрация: 14.12.2010
Сообщений: 462
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
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
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
321 / 243 / 43
Регистрация: 14.12.2010
Сообщений: 462
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 тайлинг не отрабатывает как надо OpenGL
OpenGL OpenGL текстуры
OpenGL Текстуры OpenGL
текстуры в OpenGl C#
C++ Текстуры OpenGL

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

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

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

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