Russian Qt Forum

Qt => OpenGL => Тема начата: qtkoder777 от Июль 30, 2018, 11:49



Название: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: qtkoder777 от Июль 30, 2018, 11:49
Есть старый рисователь 3д моделей на опенгл без шейдеров. В моделях много текстур. Я хочу добавить тени (shadow map). Чтобы передать текстуру в фрагмент шейдер придется править код рисователя.

Как получить в шейдере цвет, которым бы нарисовался пиксел, если бы шейдера не было?


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: Igors от Июль 30, 2018, 13:35
Есть старый рисователь 3д моделей на опенгл без шейдеров. В моделях много текстур. Я хочу добавить тени (shadow map). Чтобы передать текстуру в фрагмент шейдер придется править код рисователя.

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


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: qtkoder777 от Июль 30, 2018, 14:58
Нельзя добавить только шейдер теней, получаемую карту может использовать только "основной" фрагментный шейдер, его придется писать (ну или передрать из любого туториала). Цвет (суб) пикселя считается как диффуза + люминанса + спекуляр (последнего в дефаулт рендере нет).

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


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

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


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: qtkoder777 от Август 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();
}


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: Igors от Август 10, 2018, 15:01
Да, это типовая проблема, установка большого кол-ва униформов тормозит. Да, можно ставить только для одного (текущего) шейдера, но установки сохраняются на карте. Ускорить

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

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


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: qtkoder777 от Август 10, 2018, 16:49
а) Проверить если текущее значение == новому, то не дергать униформ
А после release он не забудет то что было раньше установлено?


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: Авварон от Август 10, 2018, 17:55
А после release он не забудет то что было раньше установлено?

А я вот изучаю ща ОГЛ и тот же вопрос возникал.


Название: Re: Получить в шейдере цвет каким бы он был без шейдера
Отправлено: Igors от Август 11, 2018, 01:14
А после release он не забудет то что было раньше установлено?
Нет, хранит до удаления

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

Одна и та же сцена с шейдерами рисуется медленнее, чем без.
Ну программирование на GLSL очень специфично, причин тормозов может быть много