Настройка преобразования проекции, модели и вида для вершинного шейдера в eigen

Я огляделся и никогда не видел, прибито, точно, что делает каждая матрица и какие операции образуют их (так что реальные вызовы собственных функций). Это то, что я ищу. Или, по крайней мере, описание процесса и пара примеров с собственными функциями, чтобы узнать, как это сделать. В любом случае, вот некоторые подробности, если они полезны:

Я настраиваю перспективную игру сверху вниз (чтобы камера была зафиксирована вниз, но она могла вращаться и перемещаться вдоль плоскости XY), но, поскольку у меня будет несколько 3D-элементов (наряду с некоторыми вещами, которые строго 2D), я думаю, перспективная проекция будет хорошо работать. Но мне интересно, какие команды были бы необходимы для формирования ортографической проекции …

Я так понимаю представление, которое можно сделать, переведя координаты камеры в начало координат, повернув вращением камеры, переместив их обратно туда, где они были, затем масштабировав для увеличения? Но какие именно функции и объекты будут задействованы, я не уверен.

А для хранения вращения любого данного объекта кватернион оказывается наилучшим выбором. Так будет ли это определять модель проекции? Если мне удастся упростить вращение до двумерного случая одного угла, будут ли кватернионы расточительными?

И нужно ли все эти матрицы восстанавливать из идентичности каждого кадра? Или их можно как-то изменить, чтобы они соответствовали новым данным?

Я действительно предпочел бы использовать eigen для этого вместо библиотеки для хранения, но мне нужно кое-что для работы, чтобы точно выяснить, что происходит … У меня есть все настройки GLSL и унифицированные матрицы, поданные в рендеринг с моими ВАО, мне просто нужно понять и сделать их.

редактировать:
Мой вершинный шейдер использует эту стандартную настройку с 3-мя равномерными mat4s, умноженными на позицию vec3:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);

Можно ли использовать mat3s и vec2 для позиционирования для достижения лучшей производительности в чисто 2D случаях?

9

Решение

Вот пример функции lookAt и setPerspective, создающей матрицы вида и проекции из простых входных данных:

void Camera::lookAt(const Eigen::Vector3f& position, const Eigen::Vector3f& target, const Eigen::Vector3f& up)
{
Matrix3f R;
R.col(2) = (position-target).normalized();
R.col(0) = up.cross(R.col(2)).normalized();
R.col(1) = R.col(2).cross(R.col(0));
mViewMatrix.topLeftCorner<3,3>() = R.transpose();
mViewMatrix.topRightCorner<3,1>() = -R.transpose() * position;
mViewMatrix(3,3) = 1.0f;
}

void Camera::setPerspective(float fovY, float aspect, float near, float far)
{
float theta = fovY*0.5;
float range = far - near;
float invtan = 1./tan(theta);

mProjectionMatrix(0,0) = invtan / aspect;
mProjectionMatrix(1,1) = invtan;
mProjectionMatrix(2,2) = -(near + far) / range;
mProjectionMatrix(3,2) = -1;
mProjectionMatrix(2,3) = -2 * near * far / range;
mProjectionMatrix(3,3) = 0;
}

Затем вы можете указать матрицы для GL:

glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_view"), 1, GL_FALSE, mCamera.viewMatrix().data());
glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_proj"), 1, GL_FALSE, mCamera.projectionMatrix().data());

Для преобразования модели (лучше оставить вид и модель отдельно), вы можете использовать модуль Geometry с классами Scaling, Translation и Quaternion для сборки объекта Affine3f.

12

Другие решения

Шейдеры запускаются для каждой вершины, переданной в конвейер рендеринга. Чтобы получить лучшую производительность, обычно вы выполняете «единообразные» операции с процессором, передаете подробную информацию каждому экземпляру шейдера, используя униформу, а затем запускаете …

В приведенном вами примере лучше вычислять только mat4 * vec4 вместо mat4 * mat4 * mat4 * vec4, в самом деле:

gl_Position = modelviewprojectionMatrix * vec4 (in_Position, 1.0);

куда modelviewprojectionMatrix является результатом projectionMatrix * viewMatrix * modelMatrix, Матричная арифметика реализована на стороне процессора, для каждого набора вершин, которые вам нужно визуализировать.

Как вы организуете данные, необходимые для выведения матриц модель-вид-проекция, это соответствует вашим требованиям. Фактическая производительность зависит от графика сцены, который будет представлен; например, если вы делаете только переводы (возможно, только на плоскости XY), возможны только векторные переводы, генерирующие матрицы, когда они необходимы.

Матрицы умножаются на стандартные алгебраическая операция. Матрицы могут быть модельные матрицы или матрицы проекций. Преобразования могут быть объединены путем умножения двух матриц преобразования.

0

По вопросам рекламы [email protected]