Матрица проекции и видаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Матрица проекции и вида

Сообщение Anonymous »

Изменить
Я определил, что проблема не в моих матрицах, а в том, что glGetUniformLocation не находит запрошенную переменную
Изменить 2
Я исправил вышеуказанную ошибку, и теперь модульные матрицы работают. Итак, я думаю, что теперь ошибка возвращается к моим матрицам.

У меня возникли некоторые проблемы с правильным получением матриц проекции и просмотра. Я проверил их на нескольких примерах и не знаю, где я ошибаюсь. Я ничего не вижу на экране, пока не отключу шейдер.
Я вычисляю матрицу модели следующим образом:
float aspect = (float)width / std::max(1.0f, (float)height);
float top = tan(Maths::toRadian(FOV * 0.5f)) * near;
float bottom = -top;
float right = top * aspect;
float left = -right;

projMatrix.reset();
projMatrix(0, 0) = (2.0f * near) / (right - left);
projMatrix(1, 1) = (2.0f * near) / (top - bottom);
projMatrix(2, 2) = -(far + near) / (far - near);
projMatrix(2, 3) = -1.0f;
projMatrix(3, 2) = (-2.0f * far * near) / (far - near);
projMatrix(3, 3) = 0.0f;

Я вычисляю матрицу представления следующим образом:
Camera::Camera(const Maths::Vector3& pos)
: position(pos), target(0.0f, 0.0f, 0.0f), up(0.0f, 1.0f, 0.0f) {
target.normalize();
up.normalize();
}

Maths::Matrix4 Camera::getMatrix() const {
Maths::Matrix4 mat;
Maths::Vector3 z = position - target;
Maths::Vector3 x = Maths::crossProduct(up, z);
Maths::Vector3 y = Maths::crossProduct(z, x);

z.normalize();
x.normalize();

mat(0, 0) = x.x; mat(0, 1) = y.x; mat(0, 2) = y.z;
mat(1, 0) = x.y; mat(1, 1) = y.y; mat(1, 2) = y.z;
mat(2, 0) = x.z; mat(1, 2) = y.z; mat(2, 2) = y.z;

mat(3, 0) = -Maths::dotProduct(x, position);
mat(3, 1) = -Maths::dotProduct(y, position);
mat(3, 2) = -Maths::dotProduct(z, position);

return mat;
}

Затем я передаю их в шейдер следующим образом:
glGetUniformLocation(viewMatrix, "view");
glGetUniformLocation(projMatrix, "proj");

glUniformMatrix4fv(viewMatrix, 1, GL_TRUE, view.asArray());
glUniformMatrix4fv(projMatrix, 1, GL_TRUE, proj.asArray());

и, наконец, мой шейдер:
Vertex:
#version 330

layout (location = 0) in vec3 position;

uniform mat4 view;
uniform mat4 proj;

void main()
{
gl_Position = proj * view * vec4(position, 1.0);
};

Фрагмент:
#version 330

out vec4 gl_FragColor;

void main()
{
gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

И чтобы охватить все основы, вот мои методы расчета скалярного и перекрестного произведения:
float dotProduct(const Vector3& a, const Vector3& b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}

Vector3 crossProduct(const Vector3& a, const Vector3& b) {
return Vector3(a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.z);
}


Подробнее здесь: https://stackoverflow.com/questions/165 ... iew-matrix
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»