У меня возникли серьезные проблемы с получением вершинного шейдера моего ядра под управлением ядра OpenGL 3.3 на драйвере ATI:
#version 150
uniform mat4 graph_matrix, view_matrix, proj_matrix;
uniform bool align_origin;
attribute vec2 graph_position;
attribute vec2 screen_position;
attribute vec2 texcoord0;
attribute vec4 color;
varying vec2 texcoord0_px;
varying vec4 color_px;
void main() {
// Pick the position or the annotation position
vec2 pos = graph_position;
// Transform the coordinates
pos = vec2(graph_matrix * vec4(pos, 0.0, 1.0));
if( align_origin )
pos = floor(pos + vec2(0.5, 0.5)) + vec2(0.5, 0.5);
gl_Position = proj_matrix * view_matrix * vec4(pos + screen_position, 0.0, 1.0);
texcoord0_px = texcoord0;
color_px = color;
}
Я использовал glVertexAttrib4f, чтобы указать атрибут цвета, и отключил массив атрибутов. В соответствии со стр. 33 3.3 основной спецификации, которая должна работать:
Если массив, соответствующий общему атрибуту, требуемому вершинным шейдером, не включен, то соответствующий элемент берется из текущего общего состояния атрибута (см. раздел 2.7).
Но (в большинстве случаев, в зависимости от профиля и драйвера) шейдер либо вообще не запускался, либо использовал черный, если бы я получил доступ к отключенному атрибуту цвета. Заменив его константой, он запустил ее.
Значительный поиск дал эту страницу советов относительно WebGL, в которых было сказано следующее:
Всегда активировать массив атрибутов вершины. Если вы рисуете с отключенным атрибутом вершины 0, вы заставите браузер выполнять сложную эмуляцию при работе на настольном OpenGL (например, на Mac OSX). Это связано с тем, что в настольном OpenGL ничего не получается, если атрибут вершины 0 не включен в массив. Вы можете использовать bindAttribLocation(), чтобы заставить атрибут вершин использовать местоположение 0 и использовать enableVertexAttribArray(), чтобы сделать его включенным массивом.
Разумеется, не только атрибут цвета присваивался нулевому индексу, но, если я принудительно привязал другой атрибут с поддержкой массива к нулю, код запускал и создавал правильный цвет.
Я не могу найти никакого упоминания об этом правиле в любом месте и, конечно же, не на аппаратном обеспечении ATI. Кто-нибудь знает, откуда это правило? Или это ошибка в реализации, которую пользователи Mozilla заметили и предупредили?