На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Совсем глупые вопросы по OpenGL
    Цитата Serafim @
    Ну так вроде я не применял никаких матриц преобразований

    Как работает OpenGL?

    ExpandedWrap disabled
      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
      Цитата Pavia @
      У него есть матрица MODELVIEW и он просто умножает вектора на эту матрицу. Как у рабочего отвертка так у этого обработчика матрица.

      Следующий обработчик выполняет перспективное преобразование. Т.е. умножает на перспективную матрицу и делит первые три координаты на последнюю x/w, y/w, z/w.


      В конвейере есть много всего. И матрицы присутствуют всегда. Притом не одна.

      Таки одна. World, View и Proj перемножаются заранее, по крайней мере так в DirectX, и я очень сомневаюсь, что в OpenGL не так, это просто было бы непрактично.
      Другие матрицы есть, но это уже матрицы, не относящиеся к трансформации геометрии, например, трансформация текстурных координат.
      Сообщение отредактировано: Mikle -
        Ох, вот это рассказ целый :D И ссылочки очень крутые, я дальше вики пока не добирался, а тут целый Клондайк :good:

        Единственное пока непонятно, стоит ли мне дальше вдаваться в историю (версия 1.1) или стоит браться сразу за более-менее современные 3.2+\ES2.0+ (если не путаю). Там АПИ местами отличается, мне, как ньюблу, приходится иногда недоумевать, например почему задепрекейтили fbo, крутая штука была.

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

        Добавлено
        Цитата Mikle @
        Таки одна. World, View и Proj перемножаются заранее, по крайней мере так в DirectX, и я очень сомневаюсь, что в OpenGL не так, это просто было бы непрактично.

        я в курсе наличия лишь view и proj, по крайней мере они точно есть.

        Добавлено
        Раз уж начали про матрицы, есть ли вариант как-то покидаться вменяемыми ссылками (или объяснениями) на смысл существования оных, обычно всё описывается лаконичными "а давайте применим, чтоб преобразовать\привести к ..." без подробностей? Чисто теоретически я могу представить зачем они, точнее только одна, а вот отличия и смысл иметь их столько - хоть убей.

        Добавлено
        Цитата Serafim @
        точнее только одна

        Её описал Pavia
        Цитата Pavia @
        Следующий обработчик выполняет перспективное преобразование.


        Добавлено
        хотя в теории, помимо преобразования к нужной перспективе - ещё должна быть матрица поворота :rolleyes:

        Добавлено
        лучше не буду выдумывать своих сущностей, а подожду опровержений моих теорий от знатоков :blush:

        Добавлено
        Цитата Pavia @
        Следующий обработчик выполняет перспективное преобразование. Т.е. умножает на перспективную матрицу и делит первые три координаты на последнюю x/w, y/w, z/w.

        вот тут https://en.wikipedia.org/wiki/Graphics_pipeline написано что перспективное преобразование - это деление x/z, y/z для каждой вершины :unsure: что-то я запутался совсем :crazy:
        Сообщение отредактировано: Serafim -
          В 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 страниц.
          Сообщение отредактировано: Pavia -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0353 ]   [ 15 queries used ]   [ Generated: 5.05.24, 05:19 GMT ]