Положение шейдера vec4 или vec3

Я прочитал несколько руководств о GLSL. В определенной позиции атрибут - vec4 в некотором vec3. Я знаю, что для операций с матрицами требуется vec4, но стоит ли отправлять дополнительный элемент? Разве не лучше отправить vec3, а затем добавить в шейдер vec4 (позиция, 1.0)? Меньше данных в памяти - это будет быстрее? Или мы должны упаковать дополнительный элемент, чтобы избежать кастинга?

Любые советы, что должно быть лучше?

layout(location = 0) in vec4 position;
MVP*position;

или

layout(location = 0) in vec3 position;
MVP*vec4(position,1.0);

Ответ 1

Для атрибутов вершин это не имеет значения. 4-й компонент автоматически расширяется до 1.0, когда он отсутствует.

То есть, если вы передадите трехмерный указатель атрибута вершины на 4-мерный вектор, GL заполнит W 1.0 для вас. Я всегда использую этот маршрут, избегая необходимости явно писать vec4 (...) при выполнении умножения матрицы на позицию, а также избегать потери памяти, хранящей 4-й компонент.

Это тоже работает для 2D-координат. Двумерная координата, передаваемая атрибуту vec4, становится vec4 (x, y, 0.0, 1.0). Общее правило таково: все отсутствующие компоненты заменяются на 0.0, за исключением W, который заменяется на 1.0.

Однако для людей, которые не знают о поведении GLSL в этом случае, это может сбить с толку. Полагаю, поэтому большинство учебников никогда не затрагивают эту тему.