ПрограммированиеФорумГрафика

Несколько несложных вопросов по шедерам.

Страницы: 1 2 Следующая »
#0
15:14, 1 июля 2011

Приветствую!

Только начинаю писать шейдеры и вот возникло несколько общих вопросов:
Использую HLSL для shader model 3.

1. В сцене 8 источников света, они переданы в шейдер в виде нескольких массивов (float light_x[8], light_y[8], light_z[8] и т.п.).
При этом я хотел, чтобы вершинный шейдер выбрал из восьми источников три - самые актуальные для полигона, передал их индексы в пиксельный шейдер, который бы по ним посчитал освещение для пикселя.
Выгодно ли делать такую выборку источников света в вершинном шейдере или лучше сделать ее в приложении?

2. Насколько затратен оператор if? Когда стоит использовать [branch] if? Стоит ли выдумывать более сложные алгоритмы, чтобы избежать лишних if?

3. Значения, которые вертексный шейдер передает в пиксельный. Как именно они используются пиксельным шейдером? Скажем если я передаю нормали, то вызов пиксельного шейдера получит на вход нормаль, интерполированную из трех нормалей аутпута вершинного шейдера? И так со всеми регистрами? Можно ли передать в пиксельный шейдер что-то без интерполяции?

#1
15:32, 1 июля 2011

GKosh
> float light_x[8], light_y[8], light_z[8]
лучше передавай целыми векторами. это и читается лучше и на SIMD инструкции лучше ложится.

> самые актуальные для полигона, передал их индексы в пиксельный шейдер, который бы по ним посчитал освещение для пикселя.
обычно рассчёт подобного освещения - далеко не самая тяжёлая часть шейдера. а вот если ты добавишь туда условий и ещё чего-нибудь в этом духе, то вполне может стать самой. тут проще самому попробовать, чем воду в ступе толочь.

по второму не знаю

> 3. Значения, которые вертексный шейдер передает в пиксельный. Как именно они используются пиксельным шейдером?
интерполируются между вершинами треугольника

> Скажем если я передаю нормали, то вызов пиксельного шейдера получит на вход нормаль, интерполированную из трех нормалей аутпута вершинного шейдера?
если просто передаёшь, без выкрутасов, то да

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

#2
21:52, 1 июля 2011

GKosh
> 2. Насколько затратен оператор if? Когда стоит использовать [branch] if? Стоит
> ли выдумывать более сложные алгоритмы, чтобы избежать лишних if?

Ветвление это плохо. Использовать можно но разумно - от 1-2 условий фпс не упадет

#3
22:08, 1 июля 2011

GKosh
"...Насколько затратен..."

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

#4
22:12, 1 июля 2011

Suslik
> можно, например, юниформом
Если я начинаю менять в вертексном шейдере юниформ переменные, копмилятор шейдера почему-то выдает ошибку X3025, прося включить обратную совместимость. Включение этой самой совместимости ошибку убирает, но измененные в вертексном шейдере переменные, почему-то в пиксельном оказываются обнуленными.

Mr.TyanVary
> Ветвление это плохо. Использовать можно но разумно - от 1-2 условий фпс не
> упадет
Для выборки трех источников света из восьми, нужно 3*8 операторов if. Как же тут двумя обойтись?

#5
22:31, 1 июля 2011

GKosh
"...начинаю менять в вертексном шейдере юниформ переменные..."

Из вертексного в пиксельный передаются данные не через юниформы. В "убогом апи" это называется "varying", как в Д3Д - не знаю.

#6
22:34, 1 июля 2011

.Scotina
> В "убогом апи"

автор этих строк ждёт отчисления роялти  и самое неприятно - это не я :)

#7
22:37, 1 июля 2011

innuendo

А, кстати, кто автор? Я увидел это выражение, в первый раз, у тебя, но тут выясняется...

#8
22:40, 1 июля 2011

.Scotina
> но тут выясняется...

да тут много что выясняется :)

#9
1:38, 2 июля 2011

GKosh
Вообще зачем тебе такой бред? Ну выбрать 3 источника света.
Если ты хочешь оптимизировать освещение, то есть много других более актуальных способов.

#10
20:22, 2 июля 2011

Mr.TyanVary
> Если ты хочешь оптимизировать освещение, то есть много других более актуальных
> способов.
Конкретно каких?

#11
21:27, 2 июля 2011

GKosh
> Конкретно каких?

а какие вас интересуют ?

#12
21:31, 2 июля 2011

т.е. ты хочешь каждый проход шейдера выбирать самые актуальные источники света. это как бы супер оптимизация)
имхо лучше перенести это действие в сцену, не так уж и часто меняется "актуальность"

#13
9:47, 3 июля 2011

Задача несколько специфичная на самом деле. Шейдеры ипользуются в 2D игре, где все нарисовано спрайтами - суть ортонометрически направленными вдоль оси z затекстуренными квадами. Соответственно абсолютное большинство 3D оптимизаций не подходят. Но простая выборка для каждого квада 3х актуальных источников света - достаточно серьезно облегчает шейдер. То есть из всего множества источников света, движек загружает в вертексный шейдер 8, а в пиксельный попадает уже только три.

#14
11:58, 3 июля 2011

GKosh
> То есть из всего множества источников света, движек загружает в вертексный
> шейдер 8, а в пиксельный попадает уже только три.

вертексным овсещением никак не обойтись ? зачем пиксельное для 2D ?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.