Russian Qt Forum
Декабрь 13, 2018, 15:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить в шейдере цвет каким бы он был без шейдера  (Прочитано 1109 раз)
qtkoder777
Самовар
**
Offline Offline

Сообщений: 112


Просмотр профиля
« : Июль 30, 2018, 11:49 »

Есть старый рисователь 3д моделей на опенгл без шейдеров. В моделях много текстур. Я хочу добавить тени (shadow map). Чтобы передать текстуру в фрагмент шейдер придется править код рисователя.

Как получить в шейдере цвет, которым бы нарисовался пиксел, если бы шейдера не было?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10273


Просмотр профиля
« Ответ #1 : Июль 30, 2018, 13:35 »

Есть старый рисователь 3д моделей на опенгл без шейдеров. В моделях много текстур. Я хочу добавить тени (shadow map). Чтобы передать текстуру в фрагмент шейдер придется править код рисователя.

Как получить в шейдере цвет, которым бы нарисовался пиксел, если бы шейдера не было?
Нельзя добавить только шейдер теней, получаемую карту может использовать только "основной" фрагментный шейдер, его придется писать (ну или передрать из любого туториала). Цвет (суб) пикселя считается как диффуза + люминанса + спекуляр (последнего в дефаулт рендере нет).
Записан
qtkoder777
Самовар
**
Offline Offline

Сообщений: 112


Просмотр профиля
« Ответ #2 : Июль 30, 2018, 14:58 »

Нельзя добавить только шейдер теней, получаемую карту может использовать только "основной" фрагментный шейдер, его придется писать (ну или передрать из любого туториала). Цвет (суб) пикселя считается как диффуза + люминанса + спекуляр (последнего в дефаулт рендере нет).

Не хочется вообще трогать код рисователя. Использовать его как чёрный ящик. Иначе придется искать где там текстуры и добавлять передачу их шейдеру.
Дефаулт откуда-то знает какой там цвет текстуры. Нельзя ли без правки кода приложения получить в шейдере этот цвет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10273


Просмотр профиля
« Ответ #3 : Июль 31, 2018, 04:16 »

Не хочется вообще трогать код рисователя. Использовать его как чёрный ящик. Иначе придется искать где там текстуры и добавлять передачу их шейдеру.
Дефаулт откуда-то знает какой там цвет текстуры. Нельзя ли без правки кода приложения получить в шейдере этот цвет?
Увы, нет. Придется передавать в шейдер все текстуры, все источники света, заводить униформы, самплеры и.т.п. OpenGL не имеет нормальной pipeline, любое изменение или дополнение требует новых шейдеров, как-то пристыковаться к имеющимся нельзя. Уродство конечно, но .. "пипл хавает".

Все-таки "переходить на шейдеры" придется, и чем раньше - тем лучше. Иначе любой вопрос упрется в отсутствие (злополучных) шейдеров.
Записан
qtkoder777
Самовар
**
Offline Offline

Сообщений: 112


Просмотр профиля
« Ответ #4 : Август 10, 2018, 13:38 »

Одна и та же сцена с шейдерами рисуется медленнее, чем без. Много времени тратится на установку униформов. Можно ли это оптимизировать?
Хотелось бы заранее установить всё, что можно.
Униформы успешно ставятся только после bind(), а забинден в данный момент может быть только один шейдер. Или нет?
Использую QGLShaderProgram, рисую примерно так

Код
C++ (Qt)
for(int i=0;i<objects.count();++i)
{
     objects[i]->shader->bind();
     objects[i]->setUniforms();
     objects[i]->draw();
     objects[i]->shader->release();
}
« Последнее редактирование: Август 10, 2018, 13:40 от qtkoder777 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10273


Просмотр профиля
« Ответ #5 : Август 10, 2018, 15:01 »

Да, это типовая проблема, установка большого кол-ва униформов тормозит. Да, можно ставить только для одного (текущего) шейдера, но установки сохраняются на карте. Ускорить

а) Проверить если текущее значение == новому, то не дергать униформ

b) Использовать для установки ID (а не имя). Если переменных много, и имена неизбежны, то зарядить
мапу напр QMap<const char *, int>, причем именно  const char * (а не жирное QString или std::string)
Записан
qtkoder777
Самовар
**
Offline Offline

Сообщений: 112


Просмотр профиля
« Ответ #6 : Август 10, 2018, 16:49 »

а) Проверить если текущее значение == новому, то не дергать униформ
А после release он не забудет то что было раньше установлено?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2700


Просмотр профиля
« Ответ #7 : Август 10, 2018, 17:55 »

А после release он не забудет то что было раньше установлено?

А я вот изучаю ща ОГЛ и тот же вопрос возникал.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10273


Просмотр профиля
« Ответ #8 : Август 11, 2018, 01:14 »

А после release он не забудет то что было раньше установлено?
Нет, хранит до удаления

А я вот изучаю ща ОГЛ и тот же вопрос возникал.
Век бы этот кал не видел, но увы, сейчас без него не прожить.

Одна и та же сцена с шейдерами рисуется медленнее, чем без.
Ну программирование на GLSL очень специфично, причин тормозов может быть много
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.275 секунд. Запросов: 23.