Макет OpenGL Uniform Buffer std140, ошибка драйвера или я неправильно понял спецификацию?

Спецификация OpenGL лжет (или это ошибка?) .. Ссылаясь на макет для std140 с общими унифицированными буферами, он гласит:

«Набор правил, показанный в Таблице L-1, используется компилятором GLSL для элементов макета в стандарте std140. единый блок.Смещения элементов в блоке накапливаются на основе размеров предыдущих элементов в блоке (тех, которые объявлены перед переменной в вопросе ) и начального смещения. Начальное смещение первого члена всегда равно нулю.

Тип скалярной переменной (bool, int, uint, float) - Размер скаляра в базовых типах машин »

( http://www.opengl-redbook.com/appendices /AppL.pdf )

Итак, вооружившись этой информацией, я устанавливаю в своем шейдере единый блок, который выглядит примерно так:

// Spotlight.

layout (std140) uniform Spotlight
{
    float Light_Intensity;
    vec4  Light_Ambient;
    vec3  Light_Position;   
};

... только для того, чтобы обнаружить, что он не работает с последующим std140 макет, который я настраиваю на стороне процессора. Это первые 4 байта - это число с плавающей запятой (размер машинного скалярного типа для GLfloat), следующие 16 байтов - это vec4, а следующие 12 байтов - это vec3 (с 4 байтами, оставшимися на конец, чтобы принять во внимание правило, что vec3 на самом деле является vec4).

Когда я изменяю сторону ЦП, чтобы указать float как имеющий тот же размер, что и vec4, то есть 16 байт, и выполняю мои смещения и размер буфера делая это предположение, шейдер работает так, как задумано.

Итак, либо спецификация неверна, либо я неправильно понял значение слова «скаляр» в данном контексте, либо у ATI есть ошибка драйвера. Может ли кто-нибудь пролить свет на эту загадку ?

6
задан Robinson 16 September 2011 в 23:54
поделиться