переменное количество огней в glsl-шейдере?

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

uniform int numberOfLights;

struct PerLight
{
    vec4 position;
    vec4 intensity;
}

uniform Lights
{
    vec4 ambientIntensity;
    float lightAttenuation;
    PerLight lights[numberOfLights];
} Lgt;

Я видел только документацию и примеры, использующие 'numberOfLights' как константу, и я не могу получить выше, чтобы работать, поэтому я предполагаю, что вы не можете иметь динамически размерную структуру в glsl.

Итак, как вы должны пропускать любое количество огней в шейдер?

5 голосов | спросил KaiserJohaan 15 AMpMon, 15 Apr 2013 00:21:38 +040021Monday 2013, 00:21:38

1 ответ


5

Вы не должны пропускать произвольное количество огней в шейдер, потому что они не будут работать, как вы обнаружили. Это не просто программное обеспечение или ограничение API; это аппаратное ограничение - каждый свет должен вписываться в пространство регистров GPU, из которых ограниченная сумма (все время увеличивается, но все же жесткий предел). Добавление вместе вклада для каждого света также приведет к тому, что вы столкнетесь с ограничениями на количество команд GPU (это уже не так важно, но в ранние дни шейдеров это было большим делом).

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

Один метод может заключаться в сумме отдельных вкладов света через несколько проходов - Doom 3 сделал это, с одним проходом на свет, и там он работал достаточно хорошо. На более современном оборудовании вы могли бы суммировать огни в группах по 2, 4, 8 или что угодно, что уменьшило бы количество проходов.

Другим способом может быть использование отложенного рендеринга (Google for info).

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

ответил Maximus Minimus 15 AMpMon, 15 Apr 2013 01:02:18 +040002Monday 2013, 01:02:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132