Сразу скажу, в OpenGL я не сильно спец, а в языке шейдеров только сегодня стал разбираться, делая один проектик for fun. В связи с чем, могу нести полную чушь.
В общем, есть такая задачка: отрисовывать некоторую сцену, содержащую как текстурированные полигоны, так и однотонные. Скажем, рисуем кубик, у которого одна грань - текстура, а другая - одноцветная.
В общем, беглым гуглением пришёл временно к такому варианту (за базу взяты шейдеры из qt-шного сэмпла отрисовки текстур, если что):
1. В вершинном шейдере считываю gl_Color, сохраняю:
varying vec4 vColor;
//...
void main(void)
{
vColor = vec4(gl_Color);
// ...
}
2. Во фрагментом шейдере делаю ветвление, переключая режимы установкой логического значения useTextures
uniform sampler2D texture;
uniform bool useTextures;
varying vec4 vColor;
varying mediump vec4 texc;
void main(void)
{
if (useTextures) {
gl_FragColor = texture2D(texture, texc.st);
} else {
gl_FragColor = vColor;
}
}
в итоге, отрисовка выглядит как "установили флаг, сделали glDrawArrays для текстуры, затем, сбросили флаг, установили цвет и сделали glDrawArrays для однотонного полигона".
Но что-то мне подсказывает, что этот вариант "в лоб" работает как-то не через то место. Если не так - развейте, пожалуйста, мои опасения
ЗЫ. Сцена довольно простая: несколько простых поверхностей, мало текстур, мало цветов. Вопросы производительности пока почти не трогают, но хотелось бы сделать всё правильно с самого начала. Тем более, за GLSL я взялся пока исключительно ради запуска всего добра на Maemo (там только OpenGL ES).