Самый быстрый способ написать sampler2D * 0 и sampler2D * 1, чтобы сложить их вместе? (GLSL / CG)

Я хотел бы смешать много sampler2D в один шейдер, без условий "если", используя переменную m1,m2,m3, равную 0 / 1 для каждого sampler2D, чтобы сказать, активен он или нет, и умножить на 1, что sampler2D активно в одном время.

Я наивно написал эту функцию, чтобы объединить 15 sampler2D:

    //float4 blend function is a sampler2D function that "return tex2D (tex,uv);" at 3 different altitudes

    color = blend (_TexTop *m1 + _TexTop2 *m2 + _TexTop3 *m3 + _TexTop4 *m4 + _TexTop5 *m5  ,
    _TexMid *m1 + _TexMid2 *m2 + _TexMid3 *m3 + _TexMid4 *m4 + _TexMid5 *m5 ,
    _TexBot *m1 + _TexBot2 *m2 + _TexBot3 *m3 + _TexBot4 *m4 + _TexBot5 *m5 ,
    _StrataBlendWidth,  _strataAltitudeOffset,  _StrataMidbandWidth, IN.worldPos.y, IN.uv_TexTop);

За исключением, очевидно, что это не работает, потому что невозможно добавить и умножить sampler2Ds. rarrgh!

Каков наилучший способ переписать вышеуказанную строку, чтобы включить и выключить sampler2D, используя целое число 0-1, без условий if и динамическое ветвление?

Спасибо

1 ответ

Решение

Предполагая, что я понял ваш вопрос (я не уверен), нет способа выборочно выбрать текстуру на основе однородного параметра (mx) без разветвления.

Рассмотрим пару фактов:

  1. Ветвление на униформе не всегда может быть таким дорогим, так как значение будет постоянным в пределах одного и того же вызова (я думаю, это зависит от профиля шейдера и аппаратного обеспечения, даже если избегать ветвей - хорошее практическое правило).
  2. Если в худшем случае вы хотите использовать всю свою выборку (хотя 15 кажется довольно большим числом), тогда вы можете рассмотреть выборку всех из них.

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

Например, чтобы скомпилировать 2 варианта шейдера 1 с одним сэмплером, а другой с 2, вы можете сделать что-то вроде:

#pragma multi_compile ONE_SAMP TWO_SAMPLE

#ifdef ONE_SAMP
uniform sampler2D tex1;
#endif
#ifdef TWO_SAMP
uniform sampler2D tex1;
uniform sampler2D tex2;
#endif

...

#ifdef ONE_SAMP
fixed4 col1 = tex2D(tex1,uv);
#endif
#ifdef TWO_SAMP
fixed4 col1 = tex2D(tex1,uv);
fixed4 col2 = tex2D(tex2,uv);
#endif

Затем установите активное ключевое слово по сценарию или с помощью специального редактора материалов.


РЕДАКТИРОВАТЬ

В своем ответе я предположил, что значения m1,m2 являются униформами, в противном случае, если нет, то нет способа динамической выборки текстуры без ветвления.

Другие вопросы по тегам