Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: GLSL: попеременная заливка цветом и текстурой  (Прочитано 19596 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 29-02-2012 23:11 » 

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

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

В общем, беглым гуглением пришёл временно к такому варианту (за базу взяты шейдеры из qt-шного сэмпла отрисовки текстур, если что):
1. В вершинном шейдере считываю gl_Color, сохраняю:
Код:
varying vec4 vColor;
//...
void main(void)
{
    vColor = vec4(gl_Color);
    // ...
}

2. Во фрагментом шейдере делаю ветвление, переключая режимы установкой логического значения useTextures
Код:
uniform sampler2D texture;
 uniform bool useTextures;
 varying vec4 vColor;
 varying mediump vec4 texc;
 void main(void)
 {
   if (useTextures) {
       gl_FragColor = texture2D(texture, texc.st);
   } else {
       gl_FragColor = vColor;
   }
}

в итоге, отрисовка выглядит как "установили флаг, сделали glDrawArrays для текстуры, затем, сбросили флаг, установили цвет и сделали glDrawArrays для однотонного полигона".

Но что-то мне подсказывает, что этот вариант "в лоб" работает как-то не через то место. Если не так - развейте, пожалуйста, мои опасения Улыбаюсь

ЗЫ. Сцена довольно простая: несколько простых поверхностей, мало текстур, мало цветов. Вопросы производительности пока почти не трогают, но хотелось бы сделать всё правильно с самого начала. Тем более, за GLSL я взялся пока исключительно ради запуска всего добра на Maemo (там только OpenGL ES).
« Последнее редактирование: 29-02-2012 23:14 от Вад » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 02-03-2012 15:35 » 

Поправка: на OpenGL ES 2 этот вариант не взлетел, потому что не даёт пользоваться функцией glColor, заставляя гнать цвет в шейдер через параметры. В итоге, чтобы заработало, пришлось сделать vColor uniform-параметром.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines