Желаемые цели достигнуты: сторонние демки (включая 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, и растить в себе кодера как-то не хочется.
Т. к. я сейчас в маленьком отпуске (вернулся из Киева домой на праздники), то думаю вернуться назад к теням и рейтрейсингу в шейдере, что-то я в последнее время забросил эту тему.
>Кстати, в Windows 7 OpenGL 1.1 без драйверов >эмулируется через Direct3D (майкрософт тоже >написали враппер)
ОтветитьУдалитьОткуда информация? проверил сейчас opengl32.dll для Windows 7, нету там связи с Direct3D. По идее нету смысла Microsoft заморачиваться с этим. Сделано все как и ранних версия Windows черз DirectDraw, это видно прямо в dll: вызов функции DirectDrawCreate
GL_RENDERER в консоли писал "Direct3D".
ОтветитьУдалить>GL_RENDERER в консоли писал "Direct3D".
ОтветитьУдалитьНе стоит из этого делать выводы, пока не будет видно что opengl32.dll не тащит Direct3D run time какой нибудь версии.
Если переименовать все d3d*.dll(если позволит Операционная система) то OpenGL 1.1 приложение по прежнему будет работать.
Без установленных драйверов OpenGL quake III не работает. К тому же через Direct3D эмулируется всего несколько расширений, уже не помню, каких. А прямую связь между opengl32.dll и Direct3D ты не найдешь, как и между драйвером.
ОтветитьУдалитьhttp://www.opengl.org/wiki/GlGetString
ОтветитьУдалить>А прямую связь между opengl32.dll и Direct3D ты >не найдешь
ОтветитьУдалитьда ну? В opengl32.dll виден спиcок экспортируемых функций и связь с остальными внешними dll. Ничего похожего на Direct3D нету. Есть DirectDraw, тогда нужно проверить ddraw.dll, я не думаю что Microsoft переписала DirectDraw через Direct3D что-был враппер для OpenGL. Я еще поподробнее через IDA гляну dll...
>>А прямую связь между opengl32.dll и Direct3D ты >>не найдешь
ОтветитьУдалить>да ну?
А с чего ты решил что там dll связанна с другой dll по-средством lib интерфейса. Может там dll подгружается в райнтайме явно. Тогда никаких следов взаимосвязей и не будет.
>А с чего ты решил что там dll связанна с другой >dll по-средством lib интерфейса
ОтветитьУдалитьПосмотрел через Dependency Walker. Да и более простым редактором видно что есть внутри ссылка на ddraw.dll.
>Может там dll подгружается в райнтайме явно.
тогда далжна быть строка с именем dll для использования функции LoadLibrary, к примеру LoadLibrary("d3d9.dll"), таких строк там нету.
Кстати возможно все таки сделано через Direct3D. Указатели на функции получаются через wglGetProcAdress, если идет речь о расширениях, а код функций уже в другом месте. Но остается вопрос зачем там DirectDraw и может ли DirectDraw работать вместе с Direct3D ?