Спецификация OpenGL лежит (или это ошибка?) ... Обращаясь к компоновке для std140, с общими унифицированными буферами, она гласит:
"Набор правил, показанный в Табл. L-1, используется компилятором GLSL для
элементы макета в унифицированном блоке с квалификацией std140 Смещения
члены в блоке накапливаются на основе размеров
предыдущие члены в блоке (те, которые объявлены перед переменной в
вопрос) и начальное смещение. Начальное смещение первого
член всегда равен нулю.
Тип скалярной переменной (bool, int, uint, float) - Размер скаляра в
Основные типы машин "
(http://www.opengl -redbook.com / добавления / 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 имеет ошибку драйвера. Кто-нибудь может пролить свет на эту тайну?