Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 57
1

Хотел в OpenTK создать mvp матрицу, но что то пошло не так

12.05.2018, 13:26. Показов 1617. Ответов 3

Author24 — интернет-сервис помощи студентам
C#
1
2
3
4
5
_model = _model * Matrix4.CreateRotationY(0.01f);
Matrix4 _projMatrix = Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(45.0f),800/800, 0.1f, 1000.0f);
Matrix4 _view = Matrix4.LookAt(new Vector3(10.0f, 10.0f, -10.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f,0.0f));
mvp = _model * _view * _projMatrix;
GL.UniformMatrix4(MatrixID, false, ref mvp);
В общем если эту ерунду заменить на единичные матрицы, то все работает, если нет то получается примерно это
http://rgho.st/private/6NcBQVt... 6959273a53(это если что видео)
- как видно мой куб слегка сплющенный , почему так?
когда я это делал на c++ все работало(правда там не было так много разных видов матриц проекции)
PS: сразу скажу, умножал матрицы я в правильном порядке я знаю что нужно умножать _model * _view * _projMatrix а не наоборот как это делается в c++ (не знаю зачем это нужно)ю
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2018, 13:26
Ответы с готовыми решениями:

Что-то пошло не так(
Подскажите пожалуйста! На странице регистрации, появилась надпись "На указанный в форме e-mail...

что-то пошло не так
здравствуйте, что-то браузеры лагают,опера вовсе не запускается, а гугл лагает во время...

Что-то пошло не так
дано n найти все перестановки я вроде написал, но что то не работает плиз помогите найти ошибку...

Что то пошло не так
Доброго времени суток. Собрал компьютер с такой конфигурацией: Материнская плата : MSI H110M...

3
61 / 58 / 11
Регистрация: 25.04.2017
Сообщений: 509
12.05.2018, 20:44 2
Во первых projectoin * view * model
Цитата Сообщение от Examnes Посмотреть сообщение
PS: сразу скажу, умножал матрицы я в правильном порядке я знаю что нужно умножать _model * _view * _projMatrix а не наоборот как это делается в c++ (не знаю зачем это нужно)
Это бред

Добавлено через 2 минуты
Цитата Сообщение от Examnes Посмотреть сообщение
_model = _model * Matrix4.CreateRotationY(0.01f);
Чем была матрица модели до этого надо угадать?

Добавлено через 9 минут
Цитата Сообщение от Examnes Посмотреть сообщение
В общем если эту ерунду заменить на единичные матрицы, то все работает
По тому что умножение единичных матриц в данном случае не зависит от порядка.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
12.05.2018, 23:29 3
Лучший ответ Сообщение было отмечено Examnes как решение

Решение

так все верно в чем проблемы?
в opengl матрицы используются такие: matrix[4][4];
в directx матрицы используются такие: matrix[16];

что бы не путаться просто передавайте в шейдер так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Matrix4 Projection;
Matrix4 View;
Matrix4 Model;
 
 
 
GLuint projection = glGetUniformLocationARB(shader.Id(), "Projection");
glUniformMatrix4fv(projection, 1, GL_FALSE, Projection);
 
GLuint view = glGetUniformLocationARB(shader.Id(), "View");
glUniformMatrix4fv(view, 1, GL_FALSE, View);
 
GLuint model = glGetUniformLocationARB(shader.Id(), "Model");
glUniformMatrix4fv(model, 1, GL_FALSE, Model);
а в шейдере так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#version 330 core
layout(location = 0)in vec3 aPos;
 
uniform mat4 Projection;
uniform mat4 View;
uniform mat4 Model;
 
 
void main()
{
     gl_Position =  projectoin * view * model * vec4(aPos, 1.0f);
}



или так в с++:

C++
1
2
3
4
Matrix4 MVP;
MVP = model * view * projection;
GLuint mvp = glGetUniformLocationARB(shader.Id(), "MVP");
glUniformMatrix4fv(mvp, 1, GL_FALSE, MVP);
в шейдере так:


C++
1
2
3
4
5
6
7
8
9
10
11
#version 330 core
layout(location = 0)in vec3 aPos;
 
uniform mat4 MVP;
 
 
 
void main()
{
     gl_Position =  MVP * vec4(aPos, 1.0f);
}

вот здесь это обсуждалось
http://www.gamedev.ru/flame/forum/?id=14375

Добавлено через 26 минут
Формат матрицы можно определить по формату векторов, это либо row-vector матрица (используется вектор-строка), либо column-vector матрица (используется вектор-столбец). Соответственно при использовании row-vector необходимо использовать умножать на матрицу, а при использовании column-vector умножать матрицу на вектор.

По формату расположения в памяти матрицы также делятся на два типа: row-major матрица (матрица в памяти записана по строкам) и column-major матрица (матрица в памяти записана по столбцам). Стоит отметить, что переход между форматами осуществляется путем транспонирования матрицы.
1
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 57
13.05.2018, 20:23  [ТС] 4
Цитата Сообщение от Antikl Посмотреть сообщение
так все верно в чем проблемы?
в opengl матрицы используются такие: matrix[4][4];
в directx матрицы используются такие: matrix[16];

что бы не путаться просто передавайте в шейдер так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Matrix4 Projection;
Matrix4 View;
Matrix4 Model;
 
 
 
GLuint projection = glGetUniformLocationARB(shader.Id(), "Projection");
glUniformMatrix4fv(projection, 1, GL_FALSE, Projection);
 
GLuint view = glGetUniformLocationARB(shader.Id(), "View");
glUniformMatrix4fv(view, 1, GL_FALSE, View);
 
GLuint model = glGetUniformLocationARB(shader.Id(), "Model");
glUniformMatrix4fv(model, 1, GL_FALSE, Model);
а в шейдере так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#version 330 core
layout(location = 0)in vec3 aPos;
 
uniform mat4 Projection;
uniform mat4 View;
uniform mat4 Model;
 
 
void main()
{
     gl_Position =  projectoin * view * model * vec4(aPos, 1.0f);
}



или так в с++:

C++
1
2
3
4
Matrix4 MVP;
MVP = model * view * projection;
GLuint mvp = glGetUniformLocationARB(shader.Id(), "MVP");
glUniformMatrix4fv(mvp, 1, GL_FALSE, MVP);
в шейдере так:


C++
1
2
3
4
5
6
7
8
9
10
11
#version 330 core
layout(location = 0)in vec3 aPos;
 
uniform mat4 MVP;
 
 
 
void main()
{
     gl_Position =  MVP * vec4(aPos, 1.0f);
}

вот здесь это обсуждалось
http://www.gamedev.ru/flame/forum/?id=14375

Добавлено через 26 минут
Формат матрицы можно определить по формату векторов, это либо row-vector матрица (используется вектор-строка), либо column-vector матрица (используется вектор-столбец). Соответственно при использовании row-vector необходимо использовать умножать на матрицу, а при использовании column-vector умножать матрицу на вектор.

По формату расположения в памяти матрицы также делятся на два типа: row-major матрица (матрица в памяти записана по строкам) и column-major матрица (матрица в памяти записана по столбцам). Стоит отметить, что переход между форматами осуществляется путем транспонирования матрицы.
Спасибо , ошибка была в том, что я умножал вектор на матрицу а не матрицу на вектор, опять же спасибо за информацию.
0
13.05.2018, 20:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2018, 20:23
Помогаю со студенческими работами здесь

Что-то пошло не так
Всем доброго времени суток. Случилась такая беда: частенько при работе с тырнетом приходится...

Что-то пошло не так
Есть 3 массива. Первый - содержит строки файла. Второй - Ник-Нейм. Третий - Число. Необходимо...

Что то пошло не так с видеокартой
характеристики: БП:FSP Group FSP600-80GLN 600W мать:Gigabyte B75M-D3V проц:i5-2320 озу: 8gb...

Верстка что-то пошло ни так
Собственно начал изучать html css и php Хотя html и css Давно учил, по сути дела я их вспоминаю так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru