OpenGL & asm

Тема в разделе "WASM.OpenGL", создана пользователем Rito, 21 июн 2008.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Как при работе с OpenGL использовать к примеру такую функцию gluPerspective
    Т.е. есть такой код
    Код (Text):
    1. invoke  gluPerspective,0,40468000h,0,3FF00000h,0,3FF00000h,0,40590000h
    Все эти страшные числа я получил следующим образом. Сделал проект на С и в отладчике подсмотрел вещественные числа. На С++ код такой
    Код (Text):
    1. gluPerspective(45.0f,1.0f, 1.0f ,100.0f);
    Но каждый раз делать проект на си и ковырять в отладчике для поиска перевода вещественныхчисле, это ж ужас просто.
    Как можно попроще делат.
    Например такой код
    Код (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 Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    А не адреса ли переменных подставятся инвокой? В отладчике смотрели? (я к сожалению с ней не работал)
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
  4. Rito

    Rito New Member

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

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    invoke gluPerspective, double 45.0, double 1.0, double 1.0, double 100.0
     
  6. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    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

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    А может :
    Код (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

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    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

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Rito
    Возьми fasm и не мучайся
     
  10. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    А в fasm можно вбивать вещественные числа? Минус MASM'у
     
  11. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Здесь ты пытаешся преобразовать в 32 разряда, а надо 64
    Может попробовать так:
    Код (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

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    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 позволяет все :)