Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / GLM Row Major

GLM Row Major

Страницы: 1 2 3 4 5 Следующая »
MrShoorУчастникwww10 янв. 20183:06#0
Можно как-нибудь переключить GLM в режим Row Major матриц? Смотрел по исходникам, и выглядит как будто гвоздями прибито к Column Major.
Я конечно подозреваю, что нельзя, ну а вдруг?
ArochПостоялецwww10 янв. 201810:06#1
чем transpose не устраивает?
MrShoorУчастникwww10 янв. 201810:14#2
Aroch
> чем transpose не устраивает?
Как пользоваться column major матрицами я знаю. Но хочется пользоваться row major чтобы например писать:
v = v * m1 * m2 * m3;
а не:
v = (m3 * (m2 * (m1 * v)));
ну и слева направо приятнее опять же читать.
nesПостоялецwww10 янв. 201812:13#3
MrShoor
Ээ, разве мажерность влияет на порядок умножения?
EugeneУчастникwww10 янв. 201814:05#4
MrShoor
Ох, там столько всего гвоздями прибито, причем намеренно срезается функционал в сторону минимальных различий с GLSL.
MrShoorУчастникwww10 янв. 201819:20#5
nes
> Ээ, разве мажерность влияет на порядок умножения?
Естественно.
FordPerfectПостоялецwww10 янв. 201823:37#6
MrShoor
>> Ээ, разве мажерность влияет на порядок умножения?
>Естественно.
Чё за нафиг?

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

MrShoorУчастникwww10 янв. 201823:51#7
FordPerfect
> Чё за нафиг?
Само собой матрицы умножаются строка на столбец вне зависимости от col major или row major. Но тут фокус в том, что когда ты строишь изначально матрицу с помощью функций glm - то для col major базис у тебя на выходе хранится в столбцах. Поэтому чтобы сохранить логику трансформаций - тебе их надо делать справа налево.
FordPerfectПостоялецwww11 янв. 20184:51#8
MrShoor
А можно подробнее? Я не очень подробно знаком с GLM.
MrShoorУчастникwww11 янв. 20184:57#9
FordPerfect
> А можно подробнее? Я не очень подробно знаком с GLM.
А что подробнее то? Я не пойму вопроса. Если про порядок умножения, то вот, даже в твоей статье объясняется чем отличается row от col умножения:
glm | GLM Row Major
FordPerfectПостоялецwww11 янв. 20185:40#10
MrShoor
>Я не пойму вопроса.
Да как бы тебе сказать.
>то для col major базис у тебя на выходе хранится в столбцах
Вот это мной слабо парсится.

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

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

MrShoorУчастникwww11 янв. 20186:00#11
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.

FordPerfectПостоялецwww11 янв. 20187:25#12
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.

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

MrShoorУчастникwww11 янв. 20188:00#13
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 это все не то, и на порядок умножения оно не должно влиять. Но факты от этого никак не изменятся. Поэтому предлагаю закончить этот бессмысленный спор.

Правка: 11 янв. 2018 8:02

FordPerfectПостоялецwww11 янв. 20188:02#14
>что для вектора-строки эффективнее row-major, что-ли?
А хотя да.
v = v * m1 * m2 * m3;

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

Правка: 11 янв. 2018 8:02

Страницы: 1 2 3 4 5 Следующая »

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр