Сравнение OpenGL и Direct3D

    Очень часто встречаются различные заблуждения по поводу этих двух API.

    Я попытался изложить в этой статье основные факты, которые следует знать как разработчикам, так и конечным пользователям.

    Так как тема очень холиварная, я старался придерживаться максимально нейтрального тона.

    Взгляд с высоты птичьего полёта


    Оба API предоставляют доступ к функциям аппаратного ускорения 3D-графики.

    Direct3D — проприетарная разработка Microsoft, созданная специально для Windows. В настоящее время используется так же и на Microsoft Xbox. На других платформах недоступен (если не брать в учёт эмуляцию API, предоставляемую Wine, а также виртуализацию).

    OpenGL — открытый стандарт, разрабатываемый некоммерческой организацией Khronos Group при участии сообщества. Все крупные производители GPU (nVidia, AMD, Intel), так или иначе, влияли на OpenGL. В отличие от Direct3D, доступен на очень большом количестве платформ. В частности, OpenGL является основным API для взаимодействия с GPU в Linux и Mac OS.

    «Внешние» технические различия API


    Direct3D основан на технологии COM. COM — это, по сути, стандарт бинарного представления компонентов. Как известно, классы на чистом C++ не могут быть использованы из других языков программирования, так как они не имеют стандартизованного бинарного представления. В частности, каждый компилятор использует свой собственный метод декорирования имён. COM же позволяет работать с объектно-ориентированной концепцией из любого языка, его поддерживающего. COM — это тоже Windows-specific технология (использует такие специфичные для Windows вещи, как реестр).

    В приложении на Direct3D используются указатели на интерфейсы объектов. Работа с объектом осуществляется путём вызова методов его интерфейса. Например, интерфейс так называемого device-а (device в Direct3D — это контекст выполнения для конкретного окна), имеет название (примеры для Direct3D 9) IDirect3DDevice9, для объекта текстуры — IDirect3DTexture9, и т.д. Создание объектов происходит как вызовы методов интерфейса IDirect3DDevice9, например, для текстуры это будет IDirect3DDevice9::CreateTexture.

    В Direct3D 10 произошло значительное количество изменений. Direct3D 10 не является обратно совместимым с Direct3D 9. Т.е. чтобы перенести программу на новый API потребуется переписать весь код, относящийся к рендерингу. Подробнее о Direct3D 10 ниже.

    OpenGL использует обычные функции языка C. Для них существует стандартизированный ABI, а это значит, что OpenGL может быть использован из любого языка, который поддерживает вызов функций native библиотек (т.е., практически говоря, из любого вообще).

    В OpenGL используется так называемая машина состояний (конечный автомат). Результат вызовов функций OpenGL зависит от внутреннего состояния, и может изменять его. В OpenGL, чтобы получить доступ к конкретному объекту (например, текстуре), нужно сначала выбрать его в качестве текущего функцией glBindTexture, а затем уже можно влиять на объект, например, задание содержимого текстуры осуществляется вызовом glTexImage2D.

    Аналогом концепции device-а в Direct3D здесь является контекст. Контекст OpenGL привязан к конкретному окну, так же, как и device в Direct3D.

    Общим для двух API является то, что обе не предоставляют чего либо за пределами работы с графикой. А именно, нет функций ни для создания окна, ни для работы с вводом с клавиатуры/мыши, ни для работы со звуком (здесь я не затрагиваю другие части DirectX, такие как DirectInput и DirectSound). Т.е. они не являются библиотеками высокого уровня.

    В самой упрощённой форме можно сказать так: OpenGL и Direct3D позволяют рисовать треугольники. И всё. Суть в том, что треугольники можно рисовать очень по-разному (текстуры, освещение, преобразования, и т.д.).

    Самое важное различие


    Имя ему — расширения (extensions).

    Direct3D по сути фиксирован в пределах одной мажорной версии. Какие-либо изменения/дополнения происходят только при выпуске следующей версии.

    В OpenGL реально доступное API определяется производителем GPU. Реализация OpenGL позволяет определять расширения к основной спецификации. Приложение может получить список поддерживаемых расширений во время выполнения, и проверить на доступность те, которые оно желает использовать.

    На самом деле практически весь функционал OpenGL — это расширения. Развитие OpenGL идёт так: появляется новая фишка, производитель реализовывает её в своём драйвере и документирует доступное расширение. Приложения могут использовать новые функции прямо сейчас, не дожидаясь включения в официальную спецификацию. Если это расширение специфично для конкретного производителя, то в названии оно несёт его имя (например, вот так: GL_NV_point_sprite, где NV — значит nVidia). Если расширение реализовано многими вендорами, то в названии используется EXT (например, GL_EXT_draw_range_elements).

    Со временем, если расширение широко используется, оно стандартизируется в ARB, и после этого содержит в имени ARB (например, GL_ARB_vertex_buffer_object). Такое расширение имеет официальный статус.

    Самые важные расширения со временем становятся частью основной спецификации. Каждая новая версия OpenGL — это по сути старая версия+несколько новых интегрированных расширений. При этом новые функции продолжают быть доступными как расширения. Т.е. на самом деле с точки зрения программы может быть вообще всё равно, какая версия OpenGL. Главное — какие доступны расширения. Версия OpenGL — это просто способ указать, какой набор расширений гарантированно поддерживается.

    Что нового в Direct3D 10/11 и OpenGL 3.x


    Microsoft сделали радикальную переработку API в Direct3D 10. Сейчас оно имеет более унифицированный и современный вид. Были выброшены некоторые устаревшие вещи, такие как fixed function rendering (без использования шейдеров). Ещё был выполнен переход к новой модели работы драйвера. В частности, реализация Direct3D теперь может иметь не только kernel-space часть, а и user-space. Это позволяет экономить время на переключения user-space/kernel-space. Однако, из-за новой модели драйвера, Direct3D 10 и выше недоступен на Windows XP. Учитывая всё ещё большую популярность Windows XP, это довольно грустно.

    Реализация OpenGL изначально была разделена на user-space и kernel-space части, так что там такой проблемы и не было. Ещё различие в том, что до сих пор не вносилось изменений в OpenGL API, которые не были бы обратно совместимы. Каждое нововведение — это расширение.

    Функционал, появившийся в Direct3D 10, например, геометрические шейдеры, доступен в OpenGL на любой платформе через расширение, или, начиная с OpenGL 3.2, как часть основной спецификации. Стоит особо подчеркнуть, это важно, функционал Direct3D 10/11 доступен в OpenGL на любой платформе, в том числе и Windows XP. Таким образом у многих сложилось впечатление, что Direct3D 10 не доступен на Windows XP исключительно по политическим причинам, а не из-за каких-то реальных технических проблем. Впрочем, я не могу судить здесь, сохраняя нейтральный тон, о том, были ли действительно такие проблемы при введении новой модели видео-драйверов.

    Теперь о нововведениях в OpenGL 3.x. Начиная с OpenGL 3.0 появилась так называемая deprecation model. Часть старой функциональности, относящаяся к fixed function rendering, а также к рендерингу, основанному на glBegin/glEnd, и многие другие устаревшие и неактуальные вещи, были объявлены как deprecated, и были впоследствии удалены из основной спецификации OpenGL 3.1. Это позволяет сохранять основную спецификацию в актуальной и современной форме.

    Казалось бы, это должно сломать совместимость со старыми программами. Ведь раньше, когда программа создавала контекст OpenGL, она просто получала контекст версии максимально доступной. Это было ОК, т.к. новые версии всегда являлись надстройками над предыдущими. Чтобы избежать нарушений совместимости, программы, которые хотят получить контект OpenGL 3.x должны использовать новый метод создания контекста, который позволяет указать, какую именно версию OpenGL нужно получить.

    Но, как следует из того, что уже было написано раньше про расширения, и это важно, функционал OpenGL 3.x можно получить через расширения, не создавая контекст новым методом. Т.е. OpenGL 1.1 + расширения = OpenGL 3.2! Таким образом, сохраняется полная обратная совместимость. Например, геометрические шейдеры — это расширение GL_ARB_geometry_shader4.

    Распространённые заблуждения


    OpenGL отстаёт от Direct3D, и вообще, судя по таким вялым изменениям в спецификации, наверное уже совсем мёртв.

    Собственно, причина такого заблуждения — это незнание о расширениях. Вообще говоря, OpenGL может и часто опережает (!) Direct3D в плане инноваций, т.к. производитель может добавить расширение к OpenGL, не дожидаясь никого, в то время как в Direct3D изменения может внести только Microsoft.

    OpenGL — это для программ профессиональной графики, а Direct3D — это для игр.

    Это заблуждение имеет историческую причину. OpenGL исходно разрабатывался как библиотека 3D графики, которая МОЖЕТ, но НЕ ОБЯЗАНА ускоряться аппаратно. Это также объясняет наличие некоторых функций, например рендеринг стерео-изображений, которые не нужны играм. Direct3D же разрабатывался гораздо позже, сразу с расчётом на ускорение на GPU. В момент появления многих пакетов профессиональной работы с графикой Direct3D просто не было.

    Интересные нюансы


    Microsoft поставляет вместе с Windows драйверы без поддержки OpenGL. OpenGL будет рендерить без ускорения, или эмулироваться через DirectX. Так что, если нужна поддержка OpenGL под Windows, нужно ставить драйвер с сайта производителя. Причины для такого неприятия OpenGL, скорее всего, опять чисто политические.

    Так что же делать, как жить?


    Примечание: А вот эта часть носит весьма субъективный характер.

    Если Вы — разработчик, и решаете, какое API использовать, то задумайтесь над следующим:
    За OpenGL — массовая кроссплатформенность, в частности, доступность всех новых функций и на Windows XP, где Direct3D 10/11 нет, и никогда не будет.
    Против OpenGL — драйвера в Windows из коробки не имеют поддержки OpenGL, так что ставить их нужно с сайта производителя.

    Если Вы — новичок в разработке 3D-приложений, и желаете освоить эту область, то я бы рекомендовал сделать так: сначала разобраться с Direct3D (причина тому проста — Microsoft предоставляет очень качественный SDK), а затем разобраться с OpenGL (это будет очень просто после Direct3D). К сожалению, такой вещи, как SDK, для OpenGL нет. Поэтому осваивать с нуля будет сложнее.

    Вот вроде и всё. Успехов в разработке!
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 152

      –17
      > на Windows XP, где Direct3D 10/11 нет, и никогда не будет.
      а как же www.ddbs.ru/prog_4793.html и многое другое из гугла?
        +11
        Большей частью фэйки. Изредка врапперы, транслирующие, либо отключающие функции DX10, для того, чтобы игра, которая требует наличия дх10 считала, что он есть и запустилась.
          +1
          как вариант — использование wined3d для транслирования dx10->opengl, но реализация dx10 в вайне пока слабовата.
        0
        Как архитектор часто работаю в различных 3D программах а-ля Макс, Майя.
        кстати и там и там работаю через OpenGL
        Очень интересная и познавательная статья.
          +19
          Всегда фанател от OpenGL, но он умирал умирал
          … и вот мы одни оставались на острове, а вокруг плавали акулы и голосами друзей говорили — Уря! мы переписали свое двигло с DX7 на DX8…
          … акула делала круг и говорила — Уря! Мы переписали свой двиг с DX8 на DX9…

          Я молчал и только поменял в шейдерах нормали на халфы, так как по вчерашнем драйвере было сказано что GF6800 выполняет с ними операции за такт…

          … Потом акулы до меня добрались и скушали…
            +5
            А нас в универе сразу учат на openGL
              +5
              И правильно делают.
              Имхо, знание OpenGL открывает знание графического ускорителя, а знание ДХ его награмождено доп. знаниями структуры классов. Как это бывает у МС, всё слишком нагромаждено.
              (Речь идет не о «hello world» уровне, а о более сложных решениях).

              И ещё, работа с OGL требует знания математики, чем выше уровень — тем проще работать. В ДХ всё сводится к использованию Vector, Point, Angel и т.д. (хотя матрицы тоже есть)
                –4
                Вообще-то делают как раз не правильно. Потому что по крайней мере на мехмате МГУ учат исключительно устаревшим частям OpenGL, которые как раз полностью и выкинули в новом стандарте.
              • UFO just landed and posted this here
                +4
                Сатья интересная, хоть и ничего нового. Но спасибо.

                А вот ожидания были: примеры некоторых реализаций, сравнение аналогичных отрисовок о производительности… Нет желание написать 2ю часть статьи? :)
                  +5
                  Такие же ожидания были к середине текста :) Присоединяюсь.
                    0
                    Есть желание. Когда у меня будет нормальный комп (сейчас у меня только нетбук), я попробую сделать сравнение производительности.
                    +9
                    Микрософт не добавляет конкурирующий драйвер? Фигня! Пусть Кhrоnоs подают на этих монополистов в суд (привет, Орerа!).
                      +8
                      > Так что же делать, как жить?

                      Just say 'no' to D3D.
                        +6
                        Насколько я знаю, разработчики любят DirectX не за видео, а за звук.

                        Т.е. использовать им DirectX проще для реализации всего, нежели придумывать и реализовывать связки OpenGL + OpenAL + обработку клавиатуры, мыши, *падов…

                        Нужен именно что, SDK для новичков включающий работу со всем оборудованием. А не только туториалы для создания чайника.
                        • UFO just landed and posted this here
                            0
                            Мой знакомый, именно разработчик. Сам он сидит на Linux. Он мне и пояснял чем лучше DirectX связки FOSS библиотек. (Работает в компании где был сделан Hitman)

                            Понимаю, самому бы хотелось что бы все стали использовать сплошняком FOSS, но это жизнь… За что купил, за то и продаю информацию.
                            • UFO just landed and posted this here
                                0
                                FOSS — библиотеки… Тот же Ogre3D — это опенсорс.

                                К сожалению, тут я не могу с вами спорить, я не разрабатываю профессионально игры.

                                Я лишь сказал что слышал от человека из геймдева… Верить мне или нет — ваше право.
                              0
                              Не знаю на счет FarCry а вот за WoW не скажите… он и DirectX и OpenGL юзает. Спросите в ТП близов, Mac версия на OpenGL, и елсли верить слухам, то портированние игры Mac → Linux тоже будет с реализацией OpenGL на линукс версиях
                                0
                                Вот одного не очень понимаю, что им мешает допортировать таки свои игры в Линь? Там остались то сущие крохи.
                                  0
                                  крохи… ))Но чет тянут.
                                    0
                                    Ну видимо то того, что у народа и так все под вайном идёт
                                      0
                                      Ну, судя по отзывам идёт, но у меня под Вайном ВоВ наглухо повесил систему (Убунта). Запустился, загрузился, секунды через 3 всё вешается наглухо.
                                        0
                                        Ну вайн Костыли! Хочется чистого клиента!
                                  –4
                                  DirectX любят пользователи потому что для него есть нормальные драйвера. А количество игр с двумя рендерами стремится к 0.
                                  +3
                                  SDL — вполне себе готовая свободная кроссплатформенная связка. В статье сказано почему это важно.
                                    +1
                                    Так там для 3d только инициализация OpenGL контекста.
                                    0
                                    Не вижу ничего страшного юзать OpenGL+DirectX для звука/клавы. При необходимости звук/клаву портировать намного проще чем перенести графику с DIrectX на OpenGL :-)
                                      +6
                                      Так и делают большинство, например, Quake3.

                                      По статье. Как верно подметил автор, сила OpenGL в его расширениях, но в них же и его слабость. Писать графический движок, оптимизированный для конкретной видеокарты, в зависимости от тех расширений, которая она поддерживает, не выгодно. Постоянный проблемы со стандартизацией расширений, на это много времени уходит. Помниться, когда только начинал изучать OpenGL (тогда еще был 1.1), был очень удивлен, что расширения от nVidia и стандартизированный GL_EXT по работе с массивом вершим работают с разной скоростью, которая достаточно заметна. ATI рекомендует свое, nVidia свое, а Кронос за ними не поспевает.
                                        0
                                        >Большинство игр
                                        Напоминаю — у квейка3 в пока еще этом году юбилей был — 10 лет.
                                          0
                                          Это id Tech 3. Современные движки id Tech 4 и 5 тоже используют OpenGL.
                                      0
                                      ИМХО. Разработчики любят DirectX за то что для него гораздо больше документации.
                                      +20
                                      Изначально хотел писать курсовую на DirectX, была куплена книжка, был выкачан SDK, но время шло, я не садился… И вот времени до сдачи остаётся не много, я сажусь разбираться, вижу сотню строк маловразумительного кода для окошка без ничего. И довольно толстую книжку с основами. И тут одногруппник подкидывает мне Qt Creator с готовым примером графики на OpenGL, а в нём вся эта муть уже красиво обёрнута в GLWidget (да-да, в стандартной поставке!). Остаётся от него унаследоваться и переопределить несколько методов (paintGL(), resizeGL() и initializeGL()). И всё! Рисуй в них сразу функциями OpenGLя.
                                      Курсач по комп.графике был спокойно написан за неделю (даже с бОльшей, чем нужно функциональностью) и успешно сдан. Компилится (и работает!) под Windows и Linux.
                                        –1
                                        Это вы просто не использовали аналогичные библиотеки для D3D
                                          +1
                                          На самом деле мне просто очень понравилось писать в QT. Та простота и элегантность, с которой виджет с OpenGL-визуализацией был вставлен в графический интерфейс (прямо в редакторе форм) и связан с другими элементами (через сигналы и слоты конечно). Писать эту программку было приятно. Ещё и получил профит в зачётку :-)
                                          Ну а D3D нужно ещё научить заработать в линухах. Winelib мог бы помочь, но насколько — не знаю. В данном же случае после небольших манипуляций с кодом (прописывание лишний раз пары #include'ов), удалось добиться того, что один и тот же код (без правок) компилировался в обоих ОСях (подозреваю, что в линухе стоит просто более капризная версия GCC, чем та, что идёт в поставке с виндовым Qt Creator'ом) и работал идентично. Хотя на самом деле мне это было не нужно ;-)
                                        0
                                        А как связаны DirectX и Direct3D? Кто там на ком женат?
                                          0
                                          DirectX — это семейство разных Direct'ов. И Direct3D — часть его. И так будет и ныне, и присно, и вовеки майкрософтовских веков, аминь :)
                                            0
                                            DirectX это комплект всего для мультимедиа: графика, видео, звук, ввод\вывод (включая всякие там рули и педали), сеть и мультиплеер и т.п.… как уже было замечено выше это частенько и является причиной выбора Direct3D, как части комплекта.
                                              0
                                              DirectX = Direct3D + DirectInput + DirectSound…
                                              альтернатива:
                                              SDL + OpenGL + OpenAL +…
                                              +1
                                              Вот нечто напоминающее SDK для OpenGL.
                                                +3
                                                Статья понравилась. Пока что, я на стороне OpenGL. Еще не хватает сравнения готовых вещей, таких как эффекты и работа с контроллерами (рулями, джойстиками).

                                                И, вопрос, если в OpenGL всё так замечательно, почему крупные разработчики не так часто его используют?
                                                Я думаю MS не смогла бы им заплатить, т.к. доходы от продажи игр на куче платформ куда выше.
                                                • UFO just landed and posted this here
                                                    0
                                                    Извиняюсь за размытый вопрос, я имел ввиду разработчиков под Windows.
                                                    • UFO just landed and posted this here
                                                        0
                                                        Ну в Винде же тоже есть прекрасная возможность использовать OpenGL.
                                                        Кармак со своим Quake3, Doom 3, и разработчики Half-Life 2 так и делают…
                                                          0
                                                          [сорри, рано отправил]
                                                          А вот ребята из Crytek почему-то так не поступают со своим Crysis…
                                                          • UFO just landed and posted this here
                                                              +4
                                                              Возможно по политическим соображениям.
                                                              0
                                                              C-но только кармак и еще пара игр (nwn, chronicles of riddick и еще кое что). Все остальное это следствие портов под мак.
                                                                +1
                                                                OpenGL в Half-Life 2? о_О
                                                              +1
                                                              Получают бонусы от Майкрософт. В статье написанно об этом. Сейчас тенденция такая, что игры все больше и больше разрабатываются под консоли. Под маки тоже хорошо идут. Конкуренция есть и это очень хорошо.
                                                            0
                                                            OpenGL — это Open Graphics Library. Какие еще джойстики?!
                                                            –3
                                                            К сожалению есть проблема с тем что для ноутбука ASUS с ATI 3470 для WinXP нет драйвера для OpenGL 3 ни на сайте ASUS ни ATI, а вот для Win7 — драйвер для OpenGL 3 качается через WinUpdate. В общем Microsoft ущемляет немного владельцев Windows с драйверами OpenGL, договорившись с производителями железа.

                                                            В DirectX — есть библиотеки для работы с сетью, звуком, загрузки моделей и т.п. В OpenGL это нужно делать руками или с помощью сторонних библиотек (но результат лучше чем у DirectX, по итогу, если руки прямые).

                                                            По DirectX — много литературы (книг) на английском с примерами, по OpenGL как и по любому OS литературы гораздо меньше.

                                                            Самая главная бяка перед использованием расширений OpenGL проверяйте есть они на конкретном железе или нет, многие это забывают. И тогда в примерах на железе поддерживающем частично новую спецификацию и часть расширений — пропадают текстуры на некоторых объектах и т.п. неприятности случаются.
                                                              –2
                                                              >… но результат лучше чем у DirectX, по итогу, если руки прямые…

                                                              А это как — «лучше»? У Вас данные по сети будут бегать быстрее? Или в более правильном порядке? Или звук будет более «стерео»? Или модель загрузиться более красиво?
                                                              • UFO just landed and posted this here
                                                                  –4
                                                                  В DirectX есть встроенная оптимизация и если глубоко некопаться в алгоритмах на начальных стадиях DirectX выглядит лучше. Но если хорошо покопаться в алгоритмах программирования и ручками оптимизировать — что рисовать и как в OpenGL, то после этого по качеству освещения он лучше.

                                                                  Не совсем корректно но сравнивая даже PS3 и XBOX360 — коридорные шутеры атмосфернее в PS3 (из-за теней), а вот много объектов на открытом пространстве лучше рисует XBOX360 (не намного лучше и рисует с меньшим количеством полигонов). Ну и PS3 — это урезанная OpenGL 2.0, даже не 2.1 — которая была бы достойным ответом усовершенствованному DirectX 9 в XBOX360.

                                                                  OpenGL vs DirectX, победителя нет. Новый DirectX объявляют раньше, но вот доступы новые возможности нового DirectX становятся сразу после выхода нового железа которое идёт уже с драйверами в которых есть новые расширения OpenGL равные по возможностям новому DirectX. А через некоторое время новые расширения OpenGL попадают в основной стандарт OpenGL.
                                                                    +3
                                                                    Странное вы пишете. Освещение оно как напишете в шейдере, такое и будет. PS3 это железка, на нее и надо смотреть, а не на цифры после запятой. Про сравнения платформ через атмосферность — тут вообще без коментариев.
                                                                –6
                                                                IMHO, автор всё же немного не прав. И вот в чём. Direct3D он на то и Direct, что это прямой интерфейс к железяке. То есть, в прямом смысле прямой. Сама там NVIDIA или AMD, когда пишет драйвер для Direct3D, сама реализует всякие там Direct3DDevice'ы и прочие прелести. В Microsoft же тоже не олухи полные сидят, и тоже заботятся о том, чтобы и технические коврижки были. Бонусы, конечно, бонусами, но если всё тормозило бы безбожно, то и девелоперов бы не привлекло.

                                                                OpenGL же он носит ярко выраженную клиент-серверность. Он более гибкий, и драйверы для него не подразумевают реализацию львиной доли функциональности собственными силами… Ну. Разве только AMD фанатствует и вместе со своими драйверами, половину X-Window подменяет своей библиотекой. Поэтому, OpenGL менее прямой интерфейс имеет с железякой, поэтому, всё же, когда речь идёт о статической pipeline, несколько более тормозной, чем Direct3D. Хотя, конечно, в наш век универсальных шейдеров эти тормоза особой роли уже и не играют, но исторический контекст, imho, именно такой.

                                                                Майкрософт до эпохи игрушек не такой уж и влиятельной контрой была, чтобы нечто изобретать чисто для подавления конкурентов. Всё же технологическое рациональное зерно в Direct3D было.
                                                                  +5
                                                                  По-моему вы чушь какую-то несете.

                                                                  Где вы углядели в OpenGL «клиент-серверность»? OpenGL не имеет никакого отношения к X Window.

                                                                  Direct в названии DirectX подразумевало что доступ к железу более прямой чем в WinAPI, к примеру GDI если дело идет о двухмерной графике.

                                                                  Насчет медленности OpenGL — традиционно MS поставляла кривую реализацию которая была стабильно медленнее чем DirectX. Что даже приводило к тому что в Wine некоторые игры работали значительно быстрее. Но к самому API это не имеет никакого отношения.
                                                                    –2
                                                                    А при чём тут реализация от MS? OpenGL тормозил и на UNIX'ах. Вполне себе так неплохо :) Просто к нему никогда требований особой интерактивности не предъявляли, вот он неспеша и работал. А про клиент-серверность OpenGL прямым текстом написано в спецификации. Он вполне может работать и с удалённой станцией визуализации. И к X-Window он прямое отношение имеет, потому что он в нём является подсистемой.

                                                                    Direct же более прямой не только, чем WinAPI, но и вообще прямее всех прямых. Ибо головной боли с ним, особенно в многопточных приложениях, до фига и больше.
                                                                    • UFO just landed and posted this here
                                                                        –4
                                                                        Драйверы и тулкиты по-разному устроены. У DirectX философия такая, что драйвер просто реализует всю функциональность DirectX (например, вы в сеансе терминального сервиса не сможете запустить Direct3D приложение, потому что драйвер не умеет), а у OpenGL философия такая, что драйвер может кое-что в 3D-рендеринге ускорять. Это вносит определённые различия в функционирование. OpenGL — это некий сервер, которому шлются команды через библиотеку, он там что-то себе выдумывает, как эти команды лучше выполнить, а потом зовёт железяку через драйвер. DirectX просто всегда зовёт драйвер железяки, который уже сам разбирается, что с командами делать.
                                                                        0
                                                                        Что значит «тормозил на UNIX'ах»? С чем сравнивая?
                                                                          –1
                                                                          >И к X-Window он прямое отношение имеет, потому что он в нём является подсистемой.

                                                                          [sarcasm]Узнал много нового.[/sarcasm]
                                                                            0
                                                                            Хм… Ну. Почитайте исходники, узнаете ещё больше :)
                                                                              0
                                                                              О, да вы, я смотрю прямо таки переполнены знаниями. OpenGL — ничто иное, как API. И с X-ми никак не связано, просто возможно включение в конфиге иксов GLX, но не надо путать GL и GLX, это разные вещи.
                                                                                0
                                                                                омфг. вы это серьезно?
                                                                        –3
                                                                        Эх, все это хорошо и красиво, но… Писали мы как-то приложения по выводу видео на многомониторную систему (до 8 мониторов). И оказалось, что под Direct3D это все хорошо и работает, а под OpenGL — тоже работает, но выдает 10-12 FPS (это на серваке уровня двухпроцессорного ксеона, 4 Гб ОЗУ, Nvidia GTX295 и т.д. ). И никак больше! Сам я код не писал и деталей не знаю, но у нас группа из трех программеров потратила несколько месяцев на попытки заставить OpenGL работать столь же производительно. Да, мы качали драйвера, пробовали разные версии OpenGL, разные версии винды и видеокарт, код свой оптимизировали от и до. По нулям… На одном мониторе — еще куда ни шло, на нескольких — абзац.

                                                                        В итоге, из-за этих проблем с производительностью пришлось от OpenGL отказаться полностью. Я думаю, по тем же причинам Direct3D является дефолтным (а иногда и единственным) движком в большинстве современных игр. Как бы нарисовать чайник с освещением из одной точки или курсач по графике на OpenGL — легко и прятно, а вот миллионы треугольников в реальной игре на 100fps — очень трудно.
                                                                          +6
                                                                          разработчики игр для PlayStation3 делают почти невозможное, по ходу ))
                                                                            –3
                                                                            Откуда на PS3 OpenGL? Да, там есть графическая железка, RSX, но API к ней более похож на D3D (по слухам, не имел счастья писать под консоли).
                                                                                –2
                                                                                Круто, не знал.
                                                                                0
                                                                                Там два вида апи, первый — именно как вы и сказали, свой апи. Второй — враппер на ним реализующий опенгл. Реально, все нормальные конторы используют первый.
                                                                              +6
                                                                              > Как бы нарисовать чайник с освещением из одной точки или курсач по графике на OpenGL — легко и прятно, а вот миллионы треугольников в реальной игре на 100fps — очень трудно.

                                                                              Скажите это Джону Кармаку.
                                                                                0
                                                                                Ну так ДК гений игростроения, тут не поспоришь.
                                                                                  0
                                                                                  Ну Кармак и делает последнюю игру на OpenGL, далее я так понял, он хочет от него отказаться.
                                                                                    +1
                                                                                    Откуда такая информация?
                                                                                      0
                                                                                      Ну если его не интересуют продажи под приставкине от ms, то да, откажется.
                                                                                        0
                                                                                        А это уже ОБС, были проблемы, что мол издатель хотел, чтобы они бросили linux платформу, но на самом деле там всё портирование на Линукс делает в основном один человек, и он сказал, что не откажется от этого дела
                                                                                        ttimo.vox.com/library/post/id-software-and-linux.html
                                                                                          +1
                                                                                          Скорее всего в Id tech не один рендер, и в зависимости от платформы цепляется тот или другой.
                                                                                            –1
                                                                                            А так видимо придется в любом случае очень многим делать. Хотя бы для того, чтобы игру, написанную на 11DXе можно было пускать в XP, переключив рендер на DX9, тут уж можно заодно и openGL рендер написать для *nix'ов
                                                                                            –1
                                                                                            кажется, он уже отказался, о чем с сожалением заявлял — как никак не последний человек в Khronos.
                                                                                              +1
                                                                                              Насколько я слышал на самом деле Кармак как раз не очень волнуется по-поводу того какой API использовать, так как код зависимый от OpenGL/DirectX на самом деле составляет очень малую долю всего движка.
                                                                                              0
                                                                                              Ха, собственно практически на этом все реальные конторы использующие огл по вин (имеющие клон на маке не считаются — там огл рендер идет бесплатным бонусом от портирования).
                                                                                              0
                                                                                              Дело в том что нужно учитывать особенности OpenGL при отрисовке большого количества треугольников. Основная идея в том чтоб отрисовать их за минимальное количество обращений к API, то есть желательно всего за несколько вызовов с большим количеством треугольников сразу.
                                                                                                +1
                                                                                                Товарищ наверное через glBegin/glEnd рисовать миллионы полиговон собрался.
                                                                                                0
                                                                                                На самом деле проблема скорее не в самом OpenGL а в кривых/устаревших дровах для видеокарт, которые намного хуже поддерживаются чем в дайректе.
                                                                                                +8
                                                                                                Разрешите поправить и дополнить немного?
                                                                                                а) COM также имеет стандарт на ABI, поэтому методы через COM-интерфейсы могут быть вызваны из любого языка: Си, С++, VB, Python, скрипты, да хоть Фортран. COM-интерфейс — это простой си-образный массив обычных __cdecl-функций.

                                                                                                б) внутри Dx уже нет COM-а, начиная с 5ой версии, он просто снаружи сделан совместимым с COM, т.к. это независимая от языка и относительно удобная для писания на Си технология.

                                                                                                в) В Windows начиная с XP «родной» OpenGL рендерит с ускорением, но оказывается несколько медленнее DX от того, что клиентская-сервер OpenGL реализован поверх самого DX.
                                                                                                  0
                                                                                                  Все кросплатформенные игры, которые выходят и на консолях(ПС, ХБокс) и на ПК значит написаны для OpenGL?
                                                                                                    0
                                                                                                    Не, в вашем примере не значит: XBox поддерживает через XNA тот же самый DirectX, что и PC
                                                                                                      +1
                                                                                                      Ну я имел ввиду PS3 в основном.
                                                                                                      0
                                                                                                      У всех консолей свои API для работы с графикой. Вообще у всех.
                                                                                                    • UFO just landed and posted this here
                                                                                                        0
                                                                                                        Вообще эти самые расширения — самая большая палка о двух концах, из за этого, например, игростроители нелюбят игры в Линукс портировать. Считается, что там вечные проблемы с драйверами и многие расширения глючат. Впрочем пока это не так уж далеко от истины
                                                                                                          0
                                                                                                          А от чего тогда под мак не портируют?
                                                                                                            0
                                                                                                            Что значит не портируют? Многие игры имеют порты под Мак.
                                                                                                              0
                                                                                                              Это какие же? За редкими исключениями, все игры через cider портированы и жутко тормозят. Все маководы-геймеры ставят винду и играют в нэйтив версии.
                                                                                                                –1
                                                                                                                Ну вот знаю Blizzard свои игры портирует. Хотя многие да, хитрят, используя wine. Кстати, а почему тормозит то? В Линуксе игры, запущенные через Вайн могут иметь артефакты отрисовки и некоторые отключенные фичи, но вот тормозят они редко.
                                                                                                                  0
                                                                                                                  Может, потому что фичи не отключают?

                                                                                                                  Самое удивительное, что издатели не стесняясь называют это портами, да еще и внаглую продают их по тем же ценам, что и обычные версии.
                                                                                                                    0
                                                                                                                    >Может, потому что фичи не отключают?

                                                                                                                    Здрасти, а как их не отключишь, если они тупо в вайне не реализованы, в основном это касается всякого динамического освещения.
                                                                                                          0
                                                                                                          Кармак для меня вообще бог игростроения, а еще мне кажется что OpenGL он не забросит…
                                                                                                          ЗЫ не в тему, но id делают лучшие fps.
                                                                                                            0
                                                                                                            Статья интересная, хотя и местами спорная. Я бы не стал так наезжать на D3D что типа это все деньги…
                                                                                                              –2
                                                                                                              Буду краток.

                                                                                                              OpenGL используют только энтузиасты. Он умер в тот момент, когда Khronos плюнул в лицо сообществу, выпустив OpenGL 3, и всем стало ясно, что архитектура больше развиваться не будет. Жив и используется серьезными разработчиками только OpenGL|ES, используемый на разнообразных portable устройствах.

                                                                                                              Direct3D гарантирует стабильность. Я не хочу иметь дело с зоопарком расширений, кривых драйверов и документации, содержащей куски десятилетней давности. Я хочу использовать новое железо сразу, а не ждать, когда каждая из организаций-членов Khronos после долгих перетягиваний одеяла выпустит очередную версию с кучей отсутствующих возможностей, потому что не может их поддержать. С Direct3D 10 я могу писать один код для всех вендоров разом.

                                                                                                              Веры в Microsoft у меня больше, чем веры в Khronos (который в принципе широко известен в узких кругах неадекватностью стандартов).

                                                                                                              Avoid design by committee. There should be a single person with final say in the design… and this person should have good architectural experience and instincts.
                                                                                                                0
                                                                                                                И тем не менее, просто скажите «нет» D3D до тех пор, пока Windows не научится использовать драйвера Gallium3D и M$ не портирует D3D на Gallium3D. Иначе мы имеем всего-лишь очередной vendor lock-in.

                                                                                                                Да-да. Как страшно жить!
                                                                                                                  +1
                                                                                                                  Бред!
                                                                                                                    0
                                                                                                                    Ну кстати gallium3D может запросто решить очень многие проблемы, ибо оно может предоставлять для юзерсейса различные API: openGL (на данный момент реализуют openGL 2.1), direct3D, любое другое API, которое ещё даже не родилось, а для драйверов нужно будет писать бэкенды на так называемых state tracker'ах. А кому надо, те могут напрямую использовать state tracker'ы.
                                                                                                                    Пока есть полурабочий драйвер для некоторых нвидиевских интеловских и атишных карточек, но даже это впечатляет, при учете, что первая публичная версия лишь весной появилась.
                                                                                                                  0
                                                                                                                  во, первый адекватный комент.

                                                                                                                  openGL vs DirectX — это уже давно не холивар. все зависит от того на кого направлено ваше приложение, если это конечно бизнес.
                                                                                                                  а на чем учиться — дело 10тое. Но по факту проще найти и больше зарабатывать будучи мастером DirextX.

                                                                                                                  Если выбрали своей профессией программирование — DirectX. Если нет — то какая разница? =)
                                                                                                                    +5
                                                                                                                    т.е. программисты существуют только под Виндовс? Программисты(в т.ч. 3d), работающие в других ОС по вашему — миф?
                                                                                                                      +1
                                                                                                                      Сколько у «других ОС» процентов рынка на данный момент? А игр под «другие ОС» много продается? Программисты — миф. Есть энтузиасты.
                                                                                                                        +2
                                                                                                                        Это и есть тот vendor lock-in, о котором я говорил, когда получил в ответ «Бред!»
                                                                                                                          +5
                                                                                                                          Я всегда подозревал, что гордое слово «программист» на самом деле обозначает человека, стучащего по клавиатуре за бабло ;)
                                                                                                                            0
                                                                                                                            Ну для когото это проффесия, а для когото хобби.
                                                                                                                            +1
                                                                                                                            Хм. А под мак тоже энтузиасты за бесплатно пишут? Там, типа, тоже OpenGL.
                                                                                                                            0
                                                                                                                            Нет. Но я Работаю в игрострое — здесь такое крайняя редкость.
                                                                                                                        –4
                                                                                                                        Поправьте, если я не прав, но вот это пипец:
                                                                                                                        развитие OpenGL идёт так: появляется новая фишка, производитель реализовывает её в своём драйвере и документирует доступное расширение. Приложения могут использовать новые функции прямо сейчас, не дожидаясь включения в официальную спецификацию.


                                                                                                                        Это полный пипец. Потому что приложние, по-видимому, должно лювиную долю времени проверять все и вся на наличие соответствующих расширений и, видимо, вручную кодировать N! вариантов, когда отсутствуют разные комбинации этих расширений?
                                                                                                                          –1
                                                                                                                          Можно потребовать конкретную версию OpenGL, где все нужные расширения поддерживаются сразу. Или же программа может, в случае недоступности нужного ей расширения, отказаться работать.
                                                                                                                            0
                                                                                                                            То есть в таком случае, это, в принципе, ничем не отличается от залоченой в мажорной верии функциональности и аргумент о том, что OpenGL крут наличием расширений, в принципе, сводится на нет
                                                                                                                            +5
                                                                                                                            Да нет, в реальной жизни все не так страшно. К примеру проверяем или присутствует расширение для шейдеров, если есть то используются шейдеры, иначе fixed pipeline. Это больше похоже на включение/выключение графических опций (которые и так обычно присутствуют в играх, и в тех что под DirectX) в зависимости от наличия расширений. И N! вариантов не надо для этого.
                                                                                                                            –1
                                                                                                                            Собственно, причина такого заблуждения — это незнание о расширениях. Вообще говоря, OpenGL может и часто опережает (!) Direct3D в плане инноваций, т.к. производитель может добавить расширение к OpenGL, не дожидаясь никого, в то время как в Direct3D изменения может внести только Microsoft.

                                                                                                                            Собственно причина Вашего заблуждения в том, что Release SDK для DirectX 11 вышел ещё в августе этого года и в результате некоторые игры к выходу Windows 7 уже могли использовать новые API и аппаратные фишки. Хотя видеокарты с аппаратной поддержкой Direct3D 11 появились совсем недавно.
                                                                                                                              0
                                                                                                                              Было бы интересно статистику использования в ПО OGL и DX (я имею ввиду десктоп платформу, где потенциально эти системы равноцены).
                                                                                                                              Как-то смотрел несколько сайтов со статистикой крупным по игровым тайтлам (ссылок уже не найду к сожалению) — игры или оба апи поддерживают или DX only. Ну и обычно по умолчанию рендер DX.
                                                                                                                              Судя по этому у OGL на десктопе сейчас не лучшие времена.
                                                                                                                              А вот GL ES это уже другая песня :)
                                                                                                                                0
                                                                                                                                Вот, скажем, разработчики изначально кроссплатформенных Nexuiz, или Sauerbraten используют только OGL. Посмотрите, кстати, в них отличная графика… которой как и почти всем опенсурсным проектам нехватает хороших дизайнеров.
                                                                                                                                  0
                                                                                                                                  Статистика для комерческих игр 99.9% — dx, остальное ogl. Реально я вот могу перечислить меньше десятка игр последнего десятилетия использующих последний.
                                                                                                                                  0
                                                                                                                                  Сделано средствами openGL'я
                                                                                                                                  www.youtube.com/watch?v=uSBHEWj_-zM
                                                                                                                                  но можно в качестве рендера юзать и direct3D
                                                                                                                                    0
                                                                                                                                    раз уж тут собрались OpenGL'щики, спрошу: есть проблема с отсечением объектов в, собственно, OpenGL
                                                                                                                                    дабы не писать длинных комментов, прошу последовать по ссылке и по возможности подсказать решение данной проблемы
                                                                                                                                    з.ы. пробовал обращаться с этой проблемой к разным людям с разных форумов, но ни одного толкового ответа так и не нашёл
                                                                                                                                    –1
                                                                                                                                    дайте мне демку на OpenGL 3 с графическими шейдерами под винду.
                                                                                                                                    я посмотрю на это.

                                                                                                                                    PS: видеокарта 9800GT 1GB
                                                                                                                                      0
                                                                                                                                      Да пожалуйста. Вам сюда. Там во всех демках есть и OpenGL и Direct3D.
                                                                                                                                        0
                                                                                                                                        Вы серьезно не видели OGL-приложение, использующее шейдеры под виндой?
                                                                                                                                          0
                                                                                                                                          с чего вы взяли?

                                                                                                                                          я просто описался — геометрические шейдеры.

                                                                                                                                          я хочу увидеть то, как они работают на XP, как говорится в этом топике, но в комментах было сказано, что огл работает поверх директа => в XP не может быть геометрических шейдеров…
                                                                                                                                            0
                                                                                                                                            ясно, поэтому и не понял Вас.
                                                                                                                                            Читайте внимательне, это с дефолтными дровами они поверх DX работают. С нормальными дровами — все работает как надо.
                                                                                                                                              0
                                                                                                                                              то есть не они, а OGL конечно же.
                                                                                                                                                –1
                                                                                                                                                так почему же MS не сделала DX10 под XP? я не сильно верю в маркетинговый ход и т.д., а то об этом бы много кричали и доказывали бы, что в XP можно такое замутить, но не было доказательств, только крики.

                                                                                                                                                так тогда почему же OGL с геометрическими шейдерами должен работать?
                                                                                                                                                  0
                                                                                                                                                  Маркетинговый ход. Шейдеры — это просто программы, которые загружаются в память видеокарты. Если операционная система позволяет что-то в видеокарту загружать, то и шейдеры любой разновидности должны работать. Технических ограничений тут нет.

                                                                                                                                                  DirectX 10, конечно сам по себе просто может быть неприспособленным для XP. Может, какие-то особые сервисы нужны или особенности ядра… Или .Net какая навороченная. Но как бы… Ничто не мешает OpenGL'ю работать нормально.
                                                                                                                                                    –1
                                                                                                                                                    вот сейчас специально поставлю visual c++ express, скомпилю найденное демо геометрических шейдеров, соберу и запущу на xp, стоящей в виртуалке (реальной xp нету).
                                                                                                                                                      –1
                                                                                                                                                      так, простите, я тоже могу запустить Software Rendering DX10 на XP вроде бы. хотя, может быть и не могу.

                                                                                                                                                      но в любом случае — не виртуалке будет софтовый рендер в любом случае.
                                                                                                                                                        0
                                                                                                                                                        Нифига подобного. VirtualBox делегирует вызовы графического API хост-машине (если включить поддержку 3D в настройках).
                                                                                                                                                          –1
                                                                                                                                                          Вы в любом случае смешны.

                                                                                                                                                          сами посудите — если просто передаются _вызовы_ API хостовой машине, то вообще при чем тут драйвера? тем более если виртуальное железо далеееко != реальному.
                                                                                                                                                            0
                                                                                                                                                            На хосте как ни странно это выполняется уже реальным OpenGL, то есть через реальные драйверы. В этом треде смешны именно Вы.
                                                                                                                                                              0
                                                                                                                                                              а ваш реальный OpenGL ведь не XP?

                                                                                                                                                              скорее всего линукс или семерка/виста/2008/2003.

                                                                                                                                                              в них есть поддержка нужного и, конечно, все будет работать. но это будет работать так же, как и если бы вы запустили на своей машине. идея понятна?

                                                                                                                                                              а вот на реальной XP не факт, что такое прокатит.
                                                                                                                                                                0
                                                                                                                                                                Да, похоже надо пробовать на реальной XP.
                                                                                                                                                                Нужны добровольцы :)
                                                                                                                                                                  0
                                                                                                                                                                  Вы выложите несколько демок с графическими шейдерами и мы посмотрим :)
                                                                                                                                                                    0
                                                                                                                                                                      0
                                                                                                                                                                      на семерке даже не завелась…
                                                                                                                                                                        0
                                                                                                                                                                        странно, у меня завелась и даже рисует, правда когда закрываешь — виснет.
                                                                                                                                                                        0
                                                                                                                                                                        на xp запустилось нормально. нигде не виснет.
                                                                                                                                                          +1
                                                                                                                                                          Насколько я знаю, в виртуалке такое сделать пока не выйдет. В VirtualBox точно не выйдет. Там поддерживается OpenGL до 2.1, вроде. А значит — без геометрических шейдеров. Тут нужно на живом железе проверять.
                                                                                                                                            • UFO just landed and posted this here
                                                                                                                                                +1
                                                                                                                                                Однобоко вышло — OpenGL всех уделывает, а DirectX есть злой и неудобный.
                                                                                                                                                Ведь, не всё так простенько?
                                                                                                                                                  0
                                                                                                                                                  openGL в базисе своем дает только базисные, а точнее атомарные функции.
                                                                                                                                                  чтобы отрисовать текструрированый треугольник надо сделать десятки вызовов
                                                                                                                                                  ( загрузка текстры, заливка, бинд MMU, vertex-index buffer, описать формат входа, настроить кучу матриц и… поехали )
                                                                                                                                                  успешное овладение openGL дает сильный буст в скорости( будем считать что на 20-30% меньше CPU bound чем ДХ)
                                                                                                                                                  но есть одно мелкое отличие — многим людям знакомо понятие DIP-call — это то зло( синхра проца-драйвера-видео ) которого надо избегать.
                                                                                                                                                  В DX эта чтука обходиться легко и просто потому что предсказуема.
                                                                                                                                                  В openGL место появления DIP НЕ ПРЕДСКАЗУЕМО
                                                                                                                                                  Пример — bind vertex buffer — задаем цвета, вершины, нормали…
                                                                                                                                                  В разных дровах, для разных карт и от разных лет DIP может произойти( или не произойти ) в разных местах…
                                                                                                                                                  Не буду вспоминать грусные времена когда для АТИ\нВидии писались не то что разные шейдеры — на разных языках…

                                                                                                                                                  Ну да ладно, чет я расписался.
                                                                                                                                                  В общем будем считать что openGL — для энтузиастов впереди планеты всей. Супер скорось, супер возможности… Месяцы, а то и годы обучения возможностям, правильному использованию АПИ и сопуствующей математики…
                                                                                                                                                  Посему всегда и везде над прослойкой openGL висит большой большой user-engine API.
                                                                                                                                                  Их еще называют графическими двиглами :)… :)

                                                                                                                                                  В тоже время D3D по сути и есть эта обертка упрощений разработки и использования над openGL.
                                                                                                                                                  Посему, в неком смысле, D3D можно назвать даже «графическим контролером»
                                                                                                                                                  он не low-level, он довольно сильно абстрагирован и несет в себе много базисных фенек
                                                                                                                                                  Он проще для серьезных вещей
                                                                                                                                                    0
                                                                                                                                                    От изучения «сопуствующей математики» D3D не избавит.
                                                                                                                                                      0
                                                                                                                                                      Он избавит от изучения вообще математики, а не СВОЕЙ математики.
                                                                                                                                                      Я как-то еще не встречал glVector3 (D3DXVECTOR3) в базовых поставках :)

                                                                                                                                                      OpenGL — можно сравнить с асмом, D3D — с языком более высокого уровня — всеже не все надо делать ручками

                                                                                                                                                Only users with full accounts can post comments. Log in, please.