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

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

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

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

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

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

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

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

OpenGL наложение текстуры, падает приложение - Программирование Android
после того как выполняю gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, uvCoordsBuffer);, метод drawElements крешит приложение с логами, вобще...

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

OpenGL тайлинг не отрабатывает как надо - OpenGL
Я пытаюсь затайлить текстуру 16x16 внутри региона 100x100. glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); ...

Текстуры OpenGL - C++
Подскажите пожалуйста как наложить текстуру на прямоугольник. Уже часов 5 ищу в гугле, информации там полно но до меня не доходит как это...

OpenGL текстуры - OpenGL
// texture.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <stdlib.h> #include...

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

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

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

Текстуры в OpenGL ES 2.0 - OpenGL
Добрый день! Есть анимированный спрайт. Кадры анимаций разбросаны на 2х текстурах размером 2048х2048 каждая. Вопрос: для работы с ними...

Текстуры в OpenGl - Delphi
Всем привет. Подскажите пожалуйста, как наложить текстуры сразу на все квадраты? так как у меня квадраты рисуются через полигоны и...

текстуры в OpenGl - C#
народ, кто работал с OpenGl помогите плиз, срочно надо....Возникла проблема загрузки в текстуру изображения с альфа каналом(формат tga)....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.01.2015, 23:14
Ответ Создать тему
Опции темы

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