Существует ли «наилучшая практика» матричного соглашения для шейдеров openGL (GLSL) - PullRequest
0 голосов
/ 17 декабря 2018

Таким образом, существует разница между соглашениями о матричной нотации "основной столбец" и "основной ряд", которые, как кажется, все говорят "выберите тот, который вам нравится".Похоже, 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 являются идентичными или просто повернутыми, поэтому они будут работать, даже если математическая матрица упорядочена неправильно.

Мой вопрос: существует ли "правильное" или "наиболее распространенное" соглашение?

В мире, где библиотеки шейдеров становятся все более распространенными, я хочу придерживаться «лучшего» пути в нашей системе.

...