Как и вы, я подобрал общий совет, которого следует избегать «если» на текущем мобильном оборудовании, но предыдущее обсуждение оптимизации StackOverflow показало, что это не является существенным препятствием. Так что не списывай со счетов. В любом случае, GLSL-компилятор достаточно умен и может выбрать, какой код он на самом деле выполняет, в зависимости от значений, заданных для униформ, хотя в этом случае все, что вы получаете, такое же, как если бы вы просто предоставили альтернативные шейдеры.
Тем не менее, если вы абсолютно уверены, что хотите использовать один и тот же шейдер для всех целей и хотите избежать операторов if, тогда вам, вероятно, нужно что-то вроде:
uniform lowp float textureFlag;
[...]
gl_FragColor = textureFlag * texture2D(texture, texcoordVarying) * colorVarying +
(1.0 - textureFlag) * colorVarying;
Или даже:
gl_FragColor = mix(
colorVarying,
texture2D(texture, texcoordVarying) * colorVarying,
textureFlag
)
Когда вы устанавливаете textureFlag на 1,0 или 0,0, в зависимости от того, хотите ли вы, чтобы значения текстуры были учтены.
Мне неизвестен какой-либо способ определить (i) указывает ли Sampler2D на фактическую текстурную единицу; и (ii) имеет ли конкретный текстурный блок связанный с ним буфер, для которого были загружены данные.