Таким образом, существует разница между соглашениями о матричной нотации "основной столбец" и "основной ряд", которые, как кажется, все говорят "выберите тот, который вам нравится".Похоже, OpenGL хочет, чтобы входные матрицы были представлены в памяти как «основные столбцы», и есть разница между предварительным и последующим умножением.
Так что в типичной системе трехмерной графики у вас есть преобразования для:
modelSourceVertex -> ModelToWorld -> WorldToEye (Camera) -> CameraToClip (проекция на куб 2x2x2) -> ClipToPixels (до 2d вершин в пиксельном пространстве устройства, внутреннем по отношению к GL, заданному «viewport»)
Одна тенденциячтобы предварительно вычислить последовательности, которые не сильно меняются, например: WorldToClip для оптимизации.
Я вижу в шейдерах несколько вещей.
mat4 MVP = Model * Projection;
gl_Position = modelPosition * MVP;
# **********
gl_position = Projection * Model * modelPosition;
# **********
mat4 MVP = ModelMatrix * ViewMatrix * ProjectionMatrix;
gl_Position = modelPosition * MVP;
# **********
etc
Многие из этих "краудсорсинговых" семплов кажутсяНаивные и часто ModelToWorld и WorldToEye являются идентичными или просто повернутыми, поэтому они будут работать, даже если математическая матрица упорядочена неправильно.
Мой вопрос: существует ли "правильное" или "наиболее распространенное" соглашение?
В мире, где библиотеки шейдеров становятся все более распространенными, я хочу придерживаться «лучшего» пути в нашей системе.