Vlad2001_MFS
Попробовал вашу матрицу задать для GL_PROJECTION, на координаты вершин это не влияет (то есть по прежнему нужно задавать координаты в виде 0.5f; 0.5f; что бы что то увидеть) но само изображение стало перевернутым по вертикали.
gamedevfor
Странно, на бумаге все ок. Все считается правильно. Попробуйте ее транспонировать, перед посылкой opengl'у.
Vlad2001_MFS
Смысл не в этом, я хочу передавать в шейдер координаты вершин в экранных координатах - а все эти приемы с glOrtho, gluOrtho2D и GL_PROJECTION только дают возможность привязать ViewPort к экрану в 2d проекции, а на координаты вершины это никак не влияет.
Наверное придется делать вручную свою функцию перехода от экранных координат в координаты OpenGL потому что я вижу что OpenGL сам так делать не умеет.
gamedevfor
Вы либо-что не понимаете, либо как-то не так объясняете, что вам нужно. Эта матрица как раз-таки и влияет на координаты вершин. Она преобразовывает экранные координаты в координаты clip space'а.
Вы случайно не забыли в вершинном шейдере перемножать координаты вершин на эту матрицу проекции?
Vlad2001_MFS
> Кстати, чтоб убрать переворот изображения, поменяйте местами b и t. Например,
> было b-t стало t-b.
Так вообще перестало работать (черный экран).
Vlad2001_MFS
> Вы случайно не забыли в вершинном шейдере перемножать координаты вершин на эту
> матрицу проекции?
Передал эту матрицу в шейдер и заработало.
Осталась только проблема с перевернутым изображением.
Это что - первая версия OGL??? Я такие функции использовал ещё при первом написании движка по урокам NeHe, так это сколько ж лет назад было-то!!!!
gamedevfor
Наверное придется делать вручную свою функцию перехода от экранных координат в координаты OpenGL потому что я вижу что OpenGL сам так делать не умеет.
Да. Сам ОГЛ так не умеет делать, просто потому, что сначала координаты {x,y,z} переводятся в видовые с помощью видовой матрицы (т.е. в систему отсчета камеры). Потом видовые координаты переводятся в однородные с помощью матрицы проекции. Затем с помощью матрицы вьюпорта однородные координаты превращатся в экранные.
И если в шедер передаёшь координаты точки экрана, то просто раздели соответствующую компоненту на соответствующее значение размера - {x/ViewportWidth,y/ViewportHeight}. Понятное дело, что шейдеру нужно указать эти самые размеры
PA3UJIb
Передаю в вертексный шейдер в качестве матрицы проекции эту матрицу:
Всё работает но только изображение почему то переварачивается по вертикали.
gamedevfor
В какой системе координат вы указываете вершины? Ось Y направлена вверх или вниз?
Vlad2001_MFS
> В какой системе координат в указываете вершины? Ось Y направлена вверх или
> вниз?
А как это узнать?
Задаю так:
150.0f, 100.0f, 0.0f, // Top Right 150.0f, 150.0f, 0.0f, // Bottom Right 100.0f, 150.0f, 0.0f, // Bottom Left 100.0f, 100.0f, 0.0f, // Top Left GLuint indices[] = { 0, 1, 3, // First Triangle 1, 2, 3 // Second Triangle };
Хочу задавать координаты вершин в экранных координатах где [0, 0] - top left of the screen; [screen_width, screen_height] - bottom right of the screen,
P.S. Должна быть ось Y - вниз, если я правильно понимаю.
Делал в самом шейдере: gl_Position.y = - gl_Position.y то получаю флип изображения по вертикали (то что мне нужно) но к сожалению еще получаю и смещение в нижний угол экрана (что мне вовсе не нужно).
Непонятно почему так.
gamedevfor
Поменяйте в матрице местами b и t так, чтобы было t+b и t-b. Я сейчас даже в opengl все протестировал - работает.
Vlad2001_MFS
Сделал:
two / (top - bottom); - ( ( top + bottom) / ( top - bottom));
Изображение показывает нормально (не перевернуто) но смещено по вертикали вниз (то есть координаты квадрата не [100;100] как я хочу, а [100;874] при разрешении экрана [1024;1024])
Выходит что начало координат в таком случае не верхний левый угол, а нижний левый угол.
gamedevfor
Ну тогда не знаю чем помочь, у меня в тесте все нормально работает.
Тема в архиве.