Является ли ModelViewProjection таким же, как WorldViewProjection? - PullRequest
2 голосов
/ 10 августа 2011

Я конвертирую некоторый код из HSLSL и XNA в CG и OpenGL.

Код предназначен для визуализации объемных данных. Но данные объема также не выбираются с использованием одинакового расстояния в каждом измерении, например (0,9f, 1f, 1f). Поэтому необходимо применять масштабный коэффициент.

В примере XNA и HLSL они делают следующее:

mul(input.Position * ScaleFactor, WorldViewProj);

Где WorldViewProj передается в шейдер.

В OpenGL у меня сложилось впечатление, что glstate.matrix.mvp - это ModelViewProjection, где ModelView - это World * View. Очевидно, я не прав, потому что когда я делаю следующее, ничто не рисуется.

output.Position = mul( input.Position * scale, glstate.matrix.mvp);

Том отображается с glMatrixMode, установленным в GL_MODELVIEW. Должен ли я создавать свои собственные матрицы? Если так, какие-нибудь хорошие учебники? : D

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Том отображается с glMatrixMode, установленным в GL_MODELVIEW. Должен ли я создавать свои собственные матрицы? Если так, какие-нибудь хорошие учебники? : D

glMatrixMode является своего рода оператором with для других функций манипулирования матрицей. Итак

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(...);

интерпретируется как

modelview_matrix.load_identity();
modelview_matrix.translate(...);

и т. Д.

Кроме того, см. Ответ @Tobias Schlegel. Шейдеры получают свой «постоянный» ввод в виде так называемых Uniforms . Более старые версии OpenGL передают фиксированное состояние функции, как матрица вида модели. Более новые версии OpenGL (ядро OpenGL-3 и более поздние версии) устарели во всех встроенных матричных манипуляциях. Вместо этого пользователь должен отслеживать конвейер преобразования и предоставлять все необходимые матрицы через форму, определяемую самим пользователем. Это также позволяет эмулировать поведение DirectX.

2 голосов
/ 10 августа 2011

В конвейере с фиксированной функцией openGl и DirectX отличаются тем, как они определяют пробелы. OpenGl имеет только пространство модели и пространства просмотра, следовательно, ModelViewMatrix. В DX также есть World-space. Модели переводятся из Пространства моделей в Пространство Мира, а затем в Пространство Видов.

Однако в этом случае я думаю , что вы можете рассматривать модель и пространство вида как равные. Это было бы в случае, если ваша модель центрирована в Мире (что делает перевод Модель-> Мир неоперативным).

При использовании шейдеров вы можете делать все, что хотите, и использовать пробелы, которые хотите.

Также DX использует матричные представления строк-мажоров и столбцов мажорных столбцов openGl. Поэтому, если вы копируете примеры DX, вы должны транспонировать матрицы и изменять порядок операций с матрицами.

...