Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.239.148] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Как работает OpenGL? GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); //GL11.glOrtho(-10, 10, -10, 10, 10, -10); GLU.gluPerspective(65.0f, (float)(8.0/6.0), 0.1f, 100.0f); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glViewport(0, 0, 800, 600); while (!Display.isCloseRequested()) { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glColor3f(.5f, .5f, 1.0f); GL11.glBegin(GL11.GL_TRIANGLES); GL11.glVertex3f( 0.0f, 1.0f, 0.0f); GL11.glVertex3f(-1.0f,-1.0f, 0.0f); GL11.glVertex3f( 1.0f,-1.0f, 0.0f); GL11.glEnd(); Display.update(); } Каждая функция преобразуется в команду которая записывается в список. Дойдя до Display.update(); Этот список отдаётся на исполнения. OpenGL представляет собой конвейер. Что такое конвейер? Это куча роликов на которых находится полета - доска такая. И она катится по этим роликам от одного конца комнаты к другому. Вдоль конвеера стоят рабочии. Первый рабочий кладёт половину корпуса на палету. Второй рабочий кладёт плату. Третий рабочий вставляет и прикручивает винткии. Скрепляя плату с корпусом. Четвертый рабочий кладет вторую половинку. Пятый рабочий соединяет две половинки, винтами. Шестой упаковывает в корпус. Так же и в OpenGL. Каждый обработчик получает список с командами и выполняет свою операцию. Первый обработчик разбивает ленту TRIANGLE_STRIP на триугольники. Второй обработчик выполняет преобразование координат. У него есть матрица MODELVIEW и он просто умножает вектора на эту матрицу. Как у рабочего отвертка так у этого обработчика матрица. Следующий обработчик выполняет перспективное преобразование. Т.е. умножает на перспективную матрицу и делит первые три координаты на последнюю x/w, y/w, z/w. В конвейере есть много всего. И матрицы присутствуют всегда. Притом не одна. Про конвейер лучше посмотреть в спецификации 1.3 https://www.opengl.org/registry/doc/glspec14.pdf В современных части конвейера заменены шейдерами. https://www.opengl.org/registry/doc/glspec4...re.20120806.pdf |
Сообщ.
#17
,
|
|
|
Цитата Pavia @ У него есть матрица MODELVIEW и он просто умножает вектора на эту матрицу. Как у рабочего отвертка так у этого обработчика матрица. Следующий обработчик выполняет перспективное преобразование. Т.е. умножает на перспективную матрицу и делит первые три координаты на последнюю x/w, y/w, z/w. В конвейере есть много всего. И матрицы присутствуют всегда. Притом не одна. Таки одна. World, View и Proj перемножаются заранее, по крайней мере так в DirectX, и я очень сомневаюсь, что в OpenGL не так, это просто было бы непрактично. Другие матрицы есть, но это уже матрицы, не относящиеся к трансформации геометрии, например, трансформация текстурных координат. |
Сообщ.
#18
,
|
|
|
Ох, вот это рассказ целый И ссылочки очень крутые, я дальше вики пока не добирался, а тут целый Клондайк
Единственное пока непонятно, стоит ли мне дальше вдаваться в историю (версия 1.1) или стоит браться сразу за более-менее современные 3.2+\ES2.0+ (если не путаю). Там АПИ местами отличается, мне, как ньюблу, приходится иногда недоумевать, например почему задепрекейтили fbo, крутая штука была. Пока я возьму за правило обнулять матрицы после каждых преобразований, чтоб ничего никуда не улетало, и иметь ввиду, что под капотом оно постоянно её(их) меняет. Добавлено Цитата Mikle @ Таки одна. World, View и Proj перемножаются заранее, по крайней мере так в DirectX, и я очень сомневаюсь, что в OpenGL не так, это просто было бы непрактично. я в курсе наличия лишь view и proj, по крайней мере они точно есть. Добавлено Раз уж начали про матрицы, есть ли вариант как-то покидаться вменяемыми ссылками (или объяснениями) на смысл существования оных, обычно всё описывается лаконичными "а давайте применим, чтоб преобразовать\привести к ..." без подробностей? Чисто теоретически я могу представить зачем они, точнее только одна, а вот отличия и смысл иметь их столько - хоть убей. Добавлено Цитата Serafim @ точнее только одна Её описал Pavia Цитата Pavia @ Следующий обработчик выполняет перспективное преобразование. Добавлено хотя в теории, помимо преобразования к нужной перспективе - ещё должна быть матрица поворота Добавлено лучше не буду выдумывать своих сущностей, а подожду опровержений моих теорий от знатоков Добавлено Цитата Pavia @ Следующий обработчик выполняет перспективное преобразование. Т.е. умножает на перспективную матрицу и делит первые три координаты на последнюю x/w, y/w, z/w. вот тут https://en.wikipedia.org/wiki/Graphics_pipeline написано что перспективное преобразование - это деление x/z, y/z для каждой вершины что-то я запутался совсем |
Сообщ.
#19
,
|
|
|
В DirectX 3 матрицы в OpenGL их тоже 3.
В DirectX ViewModel обозвана как World. Во время программирования можно их всегда считать и независимо изменять. LoadIndenty сбрасывает только одну из них, текущую. Такое разделение нужно для удобства. Перспективная матрица отвечает за камеру. А матрица модели за объекты сцены. По поводу рациональности. Чтобы каждый раз не вычислять, не делать умножения матриц. Во время выполнения графический движок создаёт общую матрицу, путем перемножения этих 3-х матриц OGL. x/z, y/z Это упрощённо на Z. Если выводить перспективное преобразование, то там будет X/(1+Z). Эту единицу хранят в 4-координате и берегут как зеницу ока. Потом для Z-буффера Z надо отнормировать Z/(Far- Near). Поэтому эти две операции объединяют. Доказательство Формула в OpenGL с делением на w Есть такое определение алгебра - это умение жонглировать формулами. В ком.графике очень много математики и она сложная. Её пробуют всячески упростить. К примеру, разделяй и властвуй. Поэтому и делят на две матрицы. Так проще так удобнее. К примеру у вас есть игрушка снайпер. При переключение с обычного вида на прицел изменяется угол fov камеры. Потом матрицы перемножаются. А если бы не было матрицы, то пришлось бы выполнить цикл из методов translate, rotate (перемещение, вращение) Что очень долго бы работало. А так хранят две матрицы и можно быстро переключится. Но зачастую такое упрощение математики основано на аналогии, семантики, и интуитивном понятии команд. Но зачастую такое упрощение только вносит недопонимание. Некто не хочет работать с формулами дольше 5 минут. Поэтому и пишут сделаем так. Что-бы не разводить объяснения на страницы. Но в принципе такие книги есть. К примеру: Математические методы компьютерной графики. Хотя в моей любимой книжке данный материал уложен максимум в 10 страниц. |