Мне нужно объяснение о смещениях стандартных блоков std140 - PullRequest
0 голосов
/ 30 апреля 2019

Извините за название, но я не знаю, как я могу назвать свою проблему. Я читаю о единообразных блоках в книге opengl, и меня немного смущают показанные по умолчанию смещения std140.

layout(std140) uniform TransformBlock
{
    //component             base alignment | offset | aligned offset
    float scale;            // 4  | 0  | 0
    vec3 translation;       // 16 | 4  | 16
    float rotation[3];      // 16 | 28 | 32 (rotation[0])
                            //           48 (rotation[1])
                            //           64 (rotation[2])
    mat4 projection_matrix; // 16 | 80 | 80 (column 0)
                            //           96 (column 1)
                            //           112 (column 2)
                            //           128 (column 3)
} transform;

Я знаю, что выравнивание vec3 = выравнивание vec4 = 32 бита.

Масштаб является первым компонентом, поэтому смещение равно 0, а также 4 бита, поэтому для меня ясно, что перевод должен быть на - давайте назовем его currentPosition - currentPosition + 4.

Я не понимаю, почему выравнивание смещения перевода равно 16.

Кроме того, мне неясно, почему смещение вращения составляет 28.

Перевод vec3, это означает, что есть 3 float с, поэтому 3 * 4 = 12. Моей первой мыслью было, что мы, возможно, захотим округлить его до, я не знаю, как это называется, битовое значение, но 28 не является значением такого типа.

То же самое со смещением projection_matrix.

Может ли кто-нибудь объяснить мне, как будто я идиот, пожалуйста?

1 Ответ

4 голосов
/ 30 апреля 2019

OpenGL не определяет концепцию, называемую «выравнивание смещения».Может быть, ваша книга говорит о каком-то производном количестве, но поскольку вы не назвали книгу и не указали ничего больше, чем этот пример, я не могу сказать.

Количество ценности, когда дело касается макета std140,размер (сколько места занимает), выравнивание базы, смещение и шаг массива (очевидно, имеет смысл только для массивов).Выравнивание базы накладывает ограничение на смещение;смещение должно делиться на базовое выравнивание.

vec3 имеет размер 12, поскольку он содержит 3 4-байтовых значения.Он имеет базовое выравнивание 16, потому что в стандарте говорится:

Если элемент является трехкомпонентным вектором, компоненты которого потребляют N базовых единиц оборудования, базовое выравнивание равно 4N.

Смещение элемента вычисляется путем вычисления смещения предыдущего элемента, добавления размера предыдущего элемента и последующего применения базового выравнивания к этому значению.

Итак, учитывая, что scale имеет смещение 0, размер 4 и выравнивание базы 4, смещение translation равно 16 (4, округлено до ближайшего выравнивания базы).

Базовое выравнивание и шаг массива rotation равен 16, потому что стандарт говорит:

Если элемент является массивом скаляров или векторов, базовое выравнивание и шаг массива установленычтобы соответствовать базовому выравниванию одного элемента массива, в соответствии с правилами (1), (2) и (3) и , округленными до базового выравнивания a vec4.

Акцент добавлен.

Итак,смещение translation равно 16, а его размер равен 12. Сложите их вместе, и вы получите 28. Чтобы получить смещение rotation, вы применяете базовое выравнивание rotation, что дает 32.

Также прекратить использование vec3 с .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...