[Delphi]OpenGL Wireframe

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by crazyserega1994, 8 Aug 2010.

  1. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Здравствуйте, я хочу в игре включить режим wireframe.
    Я сделал .dll-ку:
    Code:
    library Project2;
    
    uses
      SysUtils,
      Classes,opengl;
    
    {$R *.res}
    
    begin
    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
    end.
    
    И загружаю ее в процесс с помощью функции LoadLibrary_Ex которая описана здесь

    Но ничего не работает, что я не так делаю?
     
  2. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    а зачем через dll? Я с OpenGL не знаком, только с DirectX, указывай в рендере непосредственно :
    Code:
    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Scripter ему нужно этот код надо в чужом приложении выполнить, этакий чит наверное)
     
  4. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    ну тут надо хук делать на функцию glPolygonMode методом перехвата таблицы импорта (IAT), либо сплайсингом, и в хуке непосредствеено указывать в параметрах заданные константы opengl ( GL_FRONT_AND_BACK, GL_LINE ), только так
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Хук нуэен тупо на процедуру SwapBuffers, при её выполнении включаем режим Wireframe
     
  6. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    а я то думал игра его :) спасибо за пояснения
     
    1 person likes this.
  7. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Ииии так, я снова здесь :p
    Использую функции отсюда
    Мой код dll-ки:

    Code:
    library Project2;
    
    uses
      SysUtils,opengl,dialogs,windows,
      Classes,
      ApiHookTools in 'D:\Program Files\FireFox\apihook2\APIHOOK\apihooktools.pas';
    
    {$R *.res}
    
    procedure reDraw;
    begin
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    end;
    
    var data:pfunctionrestoredata;
        gg:bool;
    begin
    gg:=setprocedurehook(getmodulehandle('Gdi32.dll'),'SwapBuffers',@reDraw,data);
    end.
    
    
    При инжекте вылазит это

    Прошу мне помочь :(
     
    #7 crazyserega1994, 12 Sep 2010
    Last edited: 12 Sep 2010
  8. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Ну потому что dll неправильно работает. Чтобы все правильно работало с помощью этого ApiHookTools, нужно:

    1) Чтобы dll при загрузке устанавливала хук.
    2) Дальше новая процедура (наша, подмена тот, которую мы перехватываем) выполняет какие то действия. В данном случае это:
    Code:
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    Потом она снимает хук с процедуры, и вызывает истинную (то есть SwapBuffers с теми параметрами, которые ей передала сама программа) и снова устанавливает хук (такая реализация, как в данном юните - ApiHookTools, не подходит для многопоточных приложений).
     
    #8 Chrome~, 12 Sep 2010
    Last edited: 12 Sep 2010
  9. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Chrome~ правильно сказал, но именно сама ошибка возникает из-за того что у твоей функции нет параметров(а SwapBuffers принемает 1 параметр через стек dc : HDC вроде так.) и еще не указанно что это стандартный вызов(влепи stdcall;)
    Бред, в OpenGL приложении может быть только один главный экран(никогда не видел что бы было несколько контекстов воспроизведения) и SwapBuffers вызывается только в одном потоке, а если и в нескольких, то не одновременно(ну изврат какой то получается).
     
  10. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Вот держи http://zalil.ru/29670188

    Там написал инжектор и собственно саму DLL, тестировал на Quake 2, выгляжит достаточно наркоманско) На других играх не тестил, но думаю по исходникам будет смысл понятен что да как поменять. Кстати хук надо было тсавить не на SwapBuffers, а на glBegin, меня ток потом пробило. Что бы запустить - кидаешь Injector.exe и wh_inject.dll в папку с игрой, вводишь имя EXE игры в инжектор и запускаешь.
     
    1 person likes this.
  11. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Огромное спасибо! Сейчас посмотрим :)
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Если действительно перехватываемая функция вызывается только из одного потока, то да, проблем не должно быть. Если из нескольких, - то могут возникнуть небольшие затруднения, если использовать этот способ.
     
  13. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    В кс все работает, но правда как ты и сказал, выглядит "наркоманско", есть идеи как исправить? Пробовал использовать glDisable(DEPTH_TEST) вместо вайерфрема, не помогло, стены все-равно рисуются
     
  14. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Попробуй как то так (на основе кода Jingo Bo):
    Code:
    procedure hook_glBegin(mode: GLenum); stdcall;
    begin
      { Хехе :) }
      if (mode = GL_TRIANGLE_STRIP) or (mode = GL_TRIANGLE_FAN) then
        glDisable(GL_DEPTH_TEST)
      else
        glEnable(GL_DEPTH_TEST);
    
      UnHookCodeHook(@frd);
      glBegin(mode);
      SetProcedureHook(GetModuleHandle(PAnsiChar(opengl32)), 'glBegin', @hook_glBegin, @frd);
    end;
    Результат, - все объекты должны выводиться на передний план. Я раньше так пробовал, - не самый лучший вариант, но и не самый худший.
     
    #14 Chrome~, 13 Sep 2010
    Last edited: 13 Sep 2010
  15. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Хехе))) Вот тебе зачем нужен такой режим...


    Нас счет наркоманского вида...можно попробовать отловить когда начинется рисоваться сцена и там вызвать glClear, все старое сотрет.
     
  16. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Поверь, не для кс, просто в кс его легко смотреть, как да что
     
  17. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Тааак. Немного не по теме, но напишу здесь:

    Сделал хук на Direct3DCreate9. Инджектю, сообщение "LOL WORKING" появляется, но после этого игру крашает, в чем может быть причина? Исходик http://pastebin.com/74bhZ1Ar