OpenGL & asm

Discussion in 'WASM.OpenGL' started by Rito, Jun 21, 2008.

  1. Rito

    Rito New Member

    Blog Posts:
    0
    Как при работе с OpenGL использовать к примеру такую функцию gluPerspective
    Т.е. есть такой код
    Code (Text):
    1. invoke  gluPerspective,0,40468000h,0,3FF00000h,0,3FF00000h,0,40590000h
    Все эти страшные числа я получил следующим образом. Сделал проект на С и в отладчике подсмотрел вещественные числа. На С++ код такой
    Code (Text):
    1. gluPerspective(45.0f,1.0f, 1.0f ,100.0f);
    Но каждый раз делать проект на си и ковырять в отладчике для поиска перевода вещественныхчисле, это ж ужас просто.
    Как можно попроще делат.
    Например такой код
    Code (Text):
    1. .data
    2. perspectve_1        dd          45.0
    3. perspectve_2        dd          1.0
    4. perspectve_3        dd          1.0
    5. perspectve_4        dd          100.0
    6. .code
    7. ...
    8. invoke  gluPerspective,0,perspectve_1,0,perspectve_2,0,perspectve_3,0,perspectve_4
    9. ...
    не работает. Спрашивается почему?
     
  2. Vov4ick

    Vov4ick Владимир

    Blog Posts:
    0
    А не адреса ли переменных подставятся инвокой? В отладчике смотрели? (я к сожалению с ней не работал)
     
  3. wsd

    wsd New Member

    Blog Posts:
    0
  4. Rito

    Rito New Member

    Blog Posts:
    0
    В отладчике смотрел. Всё правильно он вставляет. Именно значения, а не адресса. Непонятки в том, что во втором случае мои числа представляются как
    42С80000
    3F800000
    3F266666
    42340000
    Т.е. совсем другие числа, чем в первом случае. В итоге он то рисует мой полигон, но совершенно искажённым, чем в первом случае.
     
  5. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    invoke gluPerspective, double 45.0, double 1.0, double 1.0, double 100.0
     
  6. Rito

    Rito New Member

    Blog Posts:
    0
    error A2114: INVOKE argument type mismatch : mismatch : 8
    error A2114: INVOKE argument type mismatch : mismatch : 6
    error A2114: INVOKE argument type mismatch : mismatch : 4
    error A2114: INVOKE argument type mismatch : mismatch : 2

    Неужто в MASM нельзя просто как то вбить 1.0, а он сам преобразует, упакует и т.д.
     
  7. zet

    zet New Member

    Blog Posts:
    0
    А может :
    Code (Text):
    1. .data
    2. perspectve_1        dq          45.0
    3. perspectve_2        dq          1.0
    4. perspectve_3        dq          1.0
    5. perspectve_4        dq          100.0
     
  8. Rito

    Rito New Member

    Blog Posts:
    0
    error A2114: INVOKE argument type mismatch : mismatch : 2
    error A2114: INVOKE argument type mismatch : mismatch : 4
    error A2114: INVOKE argument type mismatch : mismatch : 6
    error A2114: INVOKE argument type mismatch : mismatch : 8
     
  9. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Rito
    Возьми fasm и не мучайся
     
  10. Rito

    Rito New Member

    Blog Posts:
    0
    А в fasm можно вбивать вещественные числа? Минус MASM'у
     
  11. al79

    al79 Алексей

    Blog Posts:
    0
    Здесь ты пытаешся преобразовать в 32 разряда, а надо 64
    Может попробовать так:
    Code (Text):
    1. koord dq 45.0,1.0,1.0,100.0
    2. ...
    3.     sub esp,32
    4.     mov edi,esp
    5.     mov esi,offset koord
    6.     mov ecx,8
    7.     rep movsd
    8.     call gluPerspective
     
  12. FatMoon

    FatMoon New Member

    Blog Posts:
    0
    gluPerspective требует вещественных чисел ДВОЙНОЙ точности. То есть 64 разряда вместо 32. MASM не умеет убирать в стек 64-битные числа, надо или писать специальную обертку для таких вызовов OpenGL, или "подсматривать" в скомпилированном бинарнике из С++ жестко заданные значения, или делать все каждый раз вручную, создавая переменные через dq и помещая их в стек в 2 приема. И вызывать call gluPerspective вместо invoke.

    Кроме того, MASM вообще не позволяет использовать вещественные числа иначе, как задавать их в переменных, через dd или dq. Нельзя сделать PUSH 1.0, можно сделать только

    var1 dd 1.0
    ...
    push dword ptr [var1]

    FASM позволяет все :)