Приветствую!
Только начинаю писать шейдеры и вот возникло несколько общих вопросов:
Использую HLSL для shader model 3.
1. В сцене 8 источников света, они переданы в шейдер в виде нескольких массивов (float light_x[8], light_y[8], light_z[8] и т.п.).
При этом я хотел, чтобы вершинный шейдер выбрал из восьми источников три - самые актуальные для полигона, передал их индексы в пиксельный шейдер, который бы по ним посчитал освещение для пикселя.
Выгодно ли делать такую выборку источников света в вершинном шейдере или лучше сделать ее в приложении?
2. Насколько затратен оператор if? Когда стоит использовать [branch] if? Стоит ли выдумывать более сложные алгоритмы, чтобы избежать лишних if?
3. Значения, которые вертексный шейдер передает в пиксельный. Как именно они используются пиксельным шейдером? Скажем если я передаю нормали, то вызов пиксельного шейдера получит на вход нормаль, интерполированную из трех нормалей аутпута вершинного шейдера? И так со всеми регистрами? Можно ли передать в пиксельный шейдер что-то без интерполяции?
GKosh
> float light_x[8], light_y[8], light_z[8]
лучше передавай целыми векторами. это и читается лучше и на SIMD инструкции лучше ложится.
> самые актуальные для полигона, передал их индексы в пиксельный шейдер, который бы по ним посчитал освещение для пикселя.
обычно рассчёт подобного освещения - далеко не самая тяжёлая часть шейдера. а вот если ты добавишь туда условий и ещё чего-нибудь в этом духе, то вполне может стать самой. тут проще самому попробовать, чем воду в ступе толочь.
по второму не знаю
> 3. Значения, которые вертексный шейдер передает в пиксельный. Как именно они используются пиксельным шейдером?
интерполируются между вершинами треугольника
> Скажем если я передаю нормали, то вызов пиксельного шейдера получит на вход нормаль, интерполированную из трех нормалей аутпута вершинного шейдера?
если просто передаёшь, без выкрутасов, то да
> Можно ли передать в пиксельный шейдер что-то без интерполяции?
можно, например, юниформом передать информацию, общую для всего шейдера. а из вертексного шейдера во фрагментный принципиально передаётся информация, рассчитанная для отдельной вершины, которая потом будет интерполироваться. какую информацию ты не хочешь интерполировать?
GKosh
> 2. Насколько затратен оператор if? Когда стоит использовать [branch] if? Стоит
> ли выдумывать более сложные алгоритмы, чтобы избежать лишних if?
Ветвление это плохо. Использовать можно но разумно - от 1-2 условий фпс не упадет
GKosh
"...Насколько затратен..."
Ну надо учитывать, что эта операция будет выполнятся, даже не для каждого треугольника, а для каждой вершины, поэтому лучший вариант - под каждую разновидность материала иметь свой шейдер.
Suslik
> можно, например, юниформом
Если я начинаю менять в вертексном шейдере юниформ переменные, копмилятор шейдера почему-то выдает ошибку X3025, прося включить обратную совместимость. Включение этой самой совместимости ошибку убирает, но измененные в вертексном шейдере переменные, почему-то в пиксельном оказываются обнуленными.
Mr.TyanVary
> Ветвление это плохо. Использовать можно но разумно - от 1-2 условий фпс не
> упадет
Для выборки трех источников света из восьми, нужно 3*8 операторов if. Как же тут двумя обойтись?
GKosh
"...начинаю менять в вертексном шейдере юниформ переменные..."
Из вертексного в пиксельный передаются данные не через юниформы. В "убогом апи" это называется "varying", как в Д3Д - не знаю.
.Scotina
> В "убогом апи"
автор этих строк ждёт отчисления роялти и самое неприятно - это не я :)
innuendo
А, кстати, кто автор? Я увидел это выражение, в первый раз, у тебя, но тут выясняется...
.Scotina
> но тут выясняется...
да тут много что выясняется :)
GKosh
Вообще зачем тебе такой бред? Ну выбрать 3 источника света.
Если ты хочешь оптимизировать освещение, то есть много других более актуальных способов.
Mr.TyanVary
> Если ты хочешь оптимизировать освещение, то есть много других более актуальных
> способов.
Конкретно каких?
GKosh
> Конкретно каких?
а какие вас интересуют ?
т.е. ты хочешь каждый проход шейдера выбирать самые актуальные источники света. это как бы супер оптимизация)
имхо лучше перенести это действие в сцену, не так уж и часто меняется "актуальность"
Задача несколько специфичная на самом деле. Шейдеры ипользуются в 2D игре, где все нарисовано спрайтами - суть ортонометрически направленными вдоль оси z затекстуренными квадами. Соответственно абсолютное большинство 3D оптимизаций не подходят. Но простая выборка для каждого квада 3х актуальных источников света - достаточно серьезно облегчает шейдер. То есть из всего множества источников света, движек загружает в вертексный шейдер 8, а в пиксельный попадает уже только три.
GKosh
> То есть из всего множества источников света, движек загружает в вертексный
> шейдер 8, а в пиксельный попадает уже только три.
вертексным овсещением никак не обойтись ? зачем пиксельное для 2D ?
Тема в архиве.