среда, 5 января 2011 г.

DirectGL prototype is over

Думаю, что с DirectGL на данном этапе можно закругляться. 

Желаемые цели достигнуты: сторонние демки (включая DX SDK) компилируются, линкуются и запускаются с подставными интерфейсами. Все render states Direct3D 9 максимально близко переведены на OpenGL 2, так что приложения показывают идентичный результат. 

Кстати, в Windows 7 OpenGL 1.1 без драйверов эмулируется через Direct3D (майкрософт тоже написали враппер), так я смог на ноуте без OpenGL драйверов поиграть в Quake III. Тут я подумал: что, если на чистой Windows 7 запустить D3D9-демку через мой DirectGL: вызовы будут направляться OpenGL, который является обёрткой над Direct3D! Но проводить такие эксперименты я не стал, т. к. это слишком жестоко :)

Когда я только начинал наброски враппера, было интересно, получится из этого что-нибудь, или нет: фигли, портануть весь API! Но скилл, как выяснилось, позволяет, и теперь это становится даже скушным, т. к. растеризатор по своей природе примитивен, и сore API - тоже. Можно выделить несколько потенциальных проблем, которые могут возникнуть при портировании (например, экзотические атрибуты в vertex decl, HLSL-шейдеры и эффекты, инстансинг), но их придётся решать уже на конкретной задаче (а Wine решает "на месте"). Пока же можно было бы наращивать какой-нить рутинный функционал вроде загрузки DXT-текстур, работы с мешами, D3DX math (сейчас через dll-прослойку все вызовы перенаправляются в стандартный D3DX) и т. д., но это monkey job, и растить в себе кодера как-то не хочется.

Т. к. я сейчас в маленьком отпуске (вернулся из Киева домой на праздники), то думаю вернуться назад к теням и рейтрейсингу в шейдере, что-то я в последнее время забросил эту тему.

8 комментариев:

  1. >Кстати, в Windows 7 OpenGL 1.1 без драйверов >эмулируется через Direct3D (майкрософт тоже >написали враппер)
    Откуда информация? проверил сейчас opengl32.dll для Windows 7, нету там связи с Direct3D. По идее нету смысла Microsoft заморачиваться с этим. Сделано все как и ранних версия Windows черз DirectDraw, это видно прямо в dll: вызов функции DirectDrawCreate

    ОтветитьУдалить
  2. GL_RENDERER в консоли писал "Direct3D".

    ОтветитьУдалить
  3. >GL_RENDERER в консоли писал "Direct3D".
    Не стоит из этого делать выводы, пока не будет видно что opengl32.dll не тащит Direct3D run time какой нибудь версии.
    Если переименовать все d3d*.dll(если позволит Операционная система) то OpenGL 1.1 приложение по прежнему будет работать.

    ОтветитьУдалить
  4. Без установленных драйверов OpenGL quake III не работает. К тому же через Direct3D эмулируется всего несколько расширений, уже не помню, каких. А прямую связь между opengl32.dll и Direct3D ты не найдешь, как и между драйвером.

    ОтветитьУдалить
  5. >А прямую связь между opengl32.dll и Direct3D ты >не найдешь
    да ну? В opengl32.dll виден спиcок экспортируемых функций и связь с остальными внешними dll. Ничего похожего на Direct3D нету. Есть DirectDraw, тогда нужно проверить ddraw.dll, я не думаю что Microsoft переписала DirectDraw через Direct3D что-был враппер для OpenGL. Я еще поподробнее через IDA гляну dll...

    ОтветитьУдалить
  6. >>А прямую связь между opengl32.dll и Direct3D ты >>не найдешь
    >да ну?
    А с чего ты решил что там dll связанна с другой dll по-средством lib интерфейса. Может там dll подгружается в райнтайме явно. Тогда никаких следов взаимосвязей и не будет.

    ОтветитьУдалить
  7. >А с чего ты решил что там dll связанна с другой >dll по-средством lib интерфейса
    Посмотрел через Dependency Walker. Да и более простым редактором видно что есть внутри ссылка на ddraw.dll.
    >Может там dll подгружается в райнтайме явно.
    тогда далжна быть строка с именем dll для использования функции LoadLibrary, к примеру LoadLibrary("d3d9.dll"), таких строк там нету.
    Кстати возможно все таки сделано через Direct3D. Указатели на функции получаются через wglGetProcAdress, если идет речь о расширениях, а код функций уже в другом месте. Но остается вопрос зачем там DirectDraw и может ли DirectDraw работать вместе с Direct3D ?

    ОтветитьУдалить