Войти
ПрограммированиеФорумОбщее

GLM Row Major

Страницы: 1 2 3 4 5 Следующая »
#0
3:06, 10 янв 2018

Можно как-нибудь переключить GLM в режим Row Major матриц? Смотрел по исходникам, и выглядит как будто гвоздями прибито к Column Major.
Я конечно подозреваю, что нельзя, ну а вдруг?

#1
10:06, 10 янв 2018

чем transpose не устраивает?

#2
10:14, 10 янв 2018

Aroch
> чем transpose не устраивает?
Как пользоваться column major матрицами я знаю. Но хочется пользоваться row major чтобы например писать:

v = v * m1 * m2 * m3;

а не:

v = (m3 * (m2 * (m1 * v)));

ну и слева направо приятнее опять же читать.

#3
12:13, 10 янв 2018

MrShoor
Ээ, разве мажерность влияет на порядок умножения?

#4
14:05, 10 янв 2018

MrShoor
Ох, там столько всего гвоздями прибито, причем намеренно срезается функционал в сторону минимальных различий с GLSL.

#5
19:20, 10 янв 2018

nes
> Ээ, разве мажерность влияет на порядок умножения?
Естественно.

#6
23:37, 10 янв 2018

MrShoor
>> Ээ, разве мажерность влияет на порядок умножения?
>Естественно.
Чё за нафиг?

Или ты пользуешься какими-то странными определениями.
https://fgiesen.wordpress.com/2012/02/12/row-major-vs-column-majo… lumn-vectors/

#7
23:51, 10 янв 2018

FordPerfect
> Чё за нафиг?
Само собой матрицы умножаются строка на столбец вне зависимости от col major или row major. Но тут фокус в том, что когда ты строишь изначально матрицу с помощью функций glm - то для col major базис у тебя на выходе хранится в столбцах. Поэтому чтобы сохранить логику трансформаций - тебе их надо делать справа налево.

#8
4:51, 11 янв 2018

MrShoor
А можно подробнее? Я не очень подробно знаком с GLM.

#9
4:57, 11 янв 2018

FordPerfect
> А можно подробнее? Я не очень подробно знаком с GLM.
А что подробнее то? Я не пойму вопроса. Если про порядок умножения, то вот, даже в твоей статье объясняется чем отличается row от col умножения:
glm | GLM Row Major

#10
5:40, 11 янв 2018

MrShoor
>Я не пойму вопроса.
Да как бы тебе сказать.
>то для col major базис у тебя на выходе хранится в столбцах
Вот это мной слабо парсится.

Row-major и column-major - это способы хранения (представления) матрицы в памяти.
По хорошему они вообще не имеют отношения к row-vector или column-vector, совсем (заметь - векторы как раз хранятся одинаково; а никаких "row-matrix" и "column-matrix" вообще нет).

Поэтому я и спросил про GLM.
Если вообще всё поменять "row major" <-> "column major" - записи вычислений (в частности - порядку умножения) нечего меняться.
Если такое чувство, что ты хочешь для части операций интерпретировать раскладку в памяти как row-major, а для части - как column-major.
Если, например, хочешь подматрицу (столбец/строку) интерпретировать как вектор (без перетасовки в памяти) - так и скажи.

#11
6:00, 11 янв 2018

FordPerfect
> Row-major и column-major - это способы хранения (представления) матрицы в
> памяти.
Не совсем. Нет, это конечно тоже, но основной смысл всего этого - оптимизация умножения вектора на матрицу. Если умножать: m * v, то это можно уместить в 4 быстрых векторных инструкции mulladd. Если умножать v * m, то придется делать четыре dot product-а, а dot продукты обычно медленнее muladd.

Поэтому когда говорят column-major - значит вектор рассматривают как матрицу столбец (то есть 4x1 для column major, и 1x4 для row major). Вот под него базис в матрице приходится хранить в столбцах. Ну и отсюда все операции шиворот на выворот.

> Если, например, хочешь подматрицу (столбец/строку) интерпретировать как вектор
> (без перетасовки в памяти) - так и скажи.
Я хочу умножать слева направо. Например есть матрица скейла, поворота, переноса (m_s, m_r, m_t соответственно). Я хочу получить матрицу, описывающую сначала поворот, потом скейл, потом перенос. Для этого я хочу умножать:

m_res = m_s * m_r * m_t;

а не:

m_res = (m_t * (m_r * m_s));

В этом как бы и отличие row_major от col_major.

#12
7:25, 11 янв 2018

MrShoor
>Не совсем.
Видишь разницу между "что такое ???-major?" и "зачем используется ???-major?"?

>Нет, это конечно тоже, но основной смысл всего этого - оптимизация умножения вектора на матрицу. Если умножать: m * v, то это можно уместить в 4 быстрых векторных инструкции mulladd. Если умножать v * m, то придется делать четыре dot product-а, а dot продукты обычно медленнее muladd.
Производительность - одна из причин предпочитать одну раскладку другой, для определённого класса задач.
Что никак не отменяет того, что именно значат термины "row-major" и "column-major".

>Поэтому когда говорят column-major - значит вектор рассматривают как матрицу столбец (то есть 4x1 для column major, и 1x4 для row major).
Понятия row-major vs. column-major - независимы от row-vector vs. column-vector.
И кстати - ты считаешь, что для  вектора-строки эффективнее row-major, что-ли?

Если тебе для того, чтобы "получить матрицу, описывающую сначала поворот, потом скейл, потом перенос" хочется m_res = m_s * m_r * m_t; - то ты хочешь чего-то странного, с учётом, что m_r у тебя в середине.

> m_res = (m_t * (m_r * m_s));
Зачем скобки? Умножение матриц ассоциативно.

Вектор-столбец на матрицу множится M*v.
Вектор-строка: v*M.

Если библиотека для этого вводит какой-то синтаксический сахар - это уже отдельный разговор.

#13
8:00, 11 янв 2018

FordPerfect
> "получить матрицу, описывающую сначала поворот, потом скейл, потом перенос"
> хочется m_res = m_s * m_r * m_t;
Описка. Естественно я имел ввиду сначала скейл, потом поворот, потом перенос.

> Зачем скобки? Умножение матриц ассоциативно.
Ок. Для матриц да, скобки не нужны. Если же умножать вектор на матрицу, то скобки нужны, чтобы всегда умножать 4*4 на 4*1 и промежуточное значение было 4*1 (а не 4*4). Просто привычка уже ставить скобки при работе с col major матрицами.

> Вектор-столбец на матрицу множится M*v.
> Вектор-строка: v*M.
Еще раз. Библиотека с col major матрицами базис складывает в столбцы матриц. Вот простишь ты эту библиотеку: дай мне translate матрицу от вектора (1, 2, 3), а она тебе возвращает вот это:
(1 0 0 1)
(0 1 0 2)
(0 0 1 3)
(0 0 0 1)
А не вот это:
(1 0 0 0)
(0 1 0 0)
(0 0 1 0)
(1 2 3 1)
И это безотносительно того, как лежат эти данные в памяти. Хоть рандомом перемешаны. Когда библиотека умножает одну матрицу на другую, эти данные (1, 2, 3) она рассматривает как столбец.
Поэтому на такую матрицу вектор умножить вот так:
v = v * m_t
ну никак не получается, а получается только:
v = m_t * v
Хочешь применить сначала поворот потом перенос? Вот так можно:
m_result = m_t * m_r
а вот так нет:
m_result = m_r * m_t

Можно конечно ходить по форуму и доказывать, что col major это все не то, и на порядок умножения оно не должно влиять. Но факты от этого никак не изменятся. Поэтому предлагаю закончить этот бессмысленный спор.

#14
8:02, 11 янв 2018

>что для вектора-строки эффективнее row-major, что-ли?
А хотя да.

v = v * m1 * m2 * m3;

может быть эффективнее в row-major.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.