Вот с какой удивительной проблемой столкнулся. Есть большой VBO-меш уровня. В этом меше находится абсолютно вся геометрия.
Понятно, что на разных частях геометрии используются разные шейдеры, а сами эти шейдеры используют разных набор из входных атрибутов.
Где-то к примеру нормали не нужны, где-то даже текстурные координаты. Бакэнд проверяет каждый шейдер на предмет использования тех или иных атрибутов и создаёт некую общую таблицу использованных: для всех шейдеров, которые применяются на данном меше. Если какой-то атрибут не был
использован ни одним шейдером - он просто выбрасывается на этапе генерации VBO ради экономии видеопамяти.
И вот на Интелах начинается следующая чертовщина - несмотря на явное указание glBindAttribLocation, компилятор GLSL почему-то сам упорно нумерует атрибуты как ему хочется. Включить GL_ARB_explicit_attrib_location я не могу - железка слишком старая, не умеет в GL 4.1.
Явное задание всех атрибутов при помощи glBindAttribLocation тоже не прокатывает, драйвер упорно нумерует их сам. Поясню на примере.
В вершиинном шейдере, объявлены вот такие атрибуты:
attribute vec3 Vertex;
attribute vec3 TexCoord;
attribute vec3 Normal;
После компиляции вершинного и фрагментного шейдера, но перед линковкой я вызываю следующий код
glBindAttribLocationARB( shader_handle, 0, "Vertex" );
glBindAttribLocationARB( shader_handle, 1, "TexCoord" );
glBindAttribLocationARB( shader_handle, 2, "Normal" );
По факту же всё работает при условии, что абсолютно все шейдеры, использованные с этим мешем используют полный набор атрибутов.
Но представим, что в каком-то шейдере атрибут нормали не понадобился. И тут выясняется, что драйвер руководствуется следующей логикой:
1. пометить все атрибуты локацией -1
2. пометить используемые атрибуты валидными номерами, но пронумеровать их в обратном порядке. Т.е.
Vertex = 2;
TexCoord = 1;
Normal = 0;
Это не имеет никакого значения, если все шейдеры используют полный набор атрибутов, повторюсь. Но вот возникает ситуация, что нормаль не понадобилась. Теперь нумерация выглядит следующим образом:
Vertex = 1;
TexCoord = 0;
Ну и собственно всё, финиш. Меш общий, а атрибуты перемешались. Никто с подобным не сталкивался? Проблема, повторюсь, только на древних интелах.