Самый быстрый способ написать 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) без разветвления.
Рассмотрим пару фактов:
- Ветвление на униформе не всегда может быть таким дорогим, так как значение будет постоянным в пределах одного и того же вызова (я думаю, это зависит от профиля шейдера и аппаратного обеспечения, даже если избегать ветвей - хорошее практическое правило).
- Если в худшем случае вы хотите использовать всю свою выборку (хотя 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 являются униформами, в противном случае, если нет, то нет способа динамической выборки текстуры без ветвления.