GLUT32+ASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем Psionic, 7 июл 2009.

  1. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    После освоения библиотеки GLUT32 (на С++), ради интереса решил поэкспериментировать с ассемблером и наткнулся на довольно странную проблему, не все функции глюта работают (тоесть все компилится и экспортируется как показывает отлатчик, но темнемение окно программы пустое), вот простейшый код рисующий квадратик в окошке, но окошко пустое.
    Код (Text):
    1. includelib glut32.lib
    2. extern __imp__glutInitDisplayMode@4:dword
    3. extern __imp__glutInitWindowSize@8 :dword
    4. extern __imp__glutCreateWindow@4:dword
    5. extern __imp__glutMainLoop@0 :dword
    6. extern  __imp__glutIdleFunc@4:dword
    7. ;extern __imp__glutInit@8:dword
    8. extern __imp__glutPostRedisplay@0:dword
    9. extern __imp__glutDisplayFunc@4:dword
    10. includelib opengl32.lib
    11. extern __imp__glClearColor@16:dword
    12. extern __imp__glClear@4:dword
    13. extern __imp__glColor3ub@12:dword
    14. extern __imp__glFinish@0:dword
    15. extern __imp__glColor3ub@12:dword
    16. extern __imp__glBegin@4:dword
    17. extern __imp__glEnd@0:dword
    18. extern __imp__glVertex2f@8:dword
    19.  
    20.  
    21. .386
    22. .model flat
    23. .data
    24. text db 'Assember GLUT32 example'
    25. public display
    26. .code
    27. display PROC
    28. push 1
    29. push 0
    30. push 0
    31. push 0
    32. call __imp__glClearColor@16
    33. push 4000h
    34. call __imp__glClear@4
    35. push 0
    36. push 255
    37. push 0
    38. call __imp__glColor3ub@12
    39. push 9
    40. call __imp__glBegin@4
    41. push 100
    42. push 100
    43. call __imp__glVertex2f@8
    44. push 300
    45. push 100
    46. call  __imp__glVertex2f@8
    47. push 300
    48. push 300
    49. call  __imp__glVertex2f@8
    50. push 400
    51. push 400
    52. call  __imp__glVertex2f@8
    53. call __imp__glEnd@0
    54. call __imp__glFinish@0
    55. retn
    56. display EndP
    57. .code
    58. _start:
    59. push 0
    60. call __imp__glutInitDisplayMode@4
    61. push 400
    62. push 400
    63. call __imp__glutInitWindowSize@8
    64. push offset text
    65. call __imp__glutCreateWindow@4
    66. push offset display
    67. call __imp__glutDisplayFunc@4
    68. call __imp__glutMainLoop@0
    69. end _start
    Опыты с кодом показали все что между оперативными скобками glBegin() - glEnd(), словно отсутствует почему?
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    поскольку то, что между glBegin - glEnd относится к opengl32, а не glut, проблема явно не в топиковой библиотеке.
    Но так, навскидку...
    0. glClearColor требует параметров с плавающей точкой. Если с нулем еще туда-сюда, то единица точно дожна быть 1.0, а не 1
    1. при вызове glVertex2f надо передавать f... а не целые параметры.
    2. И я бы не парился с такой хитрой записью, а сделал бы opengl32.lib, и вызывал нормальным invoke glBegin, GL_константа
    3. И кстати, glut32.dll идет вместе с такой же библиотекой, в формате для масма, и тоже не надо __imp__glut... писать, точно так же через invoke все получается.
    4. Не вижу квадратика! (100,100)-(300,100)-(300,300)-(400,400) - это треугольник с хвостиком, но никак не квадратик.
     
  3. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    0. - судя по результату функция сработала правильно, по крайней мере цвет у окна черный, впрочем буду пробывать.
    1. - замена на glVertex2i тоже ничего не дает, хотя хвост в @8 насколько я знаю показывает что функция "прохавает" любые две четырехбайтные константы (я не силен в теории написания API поправте меня пожалуйста, если что ;) ).
    2. - я как всегда преуспеваю в изобретании велосипедов ;)
    3. - у меня была пара файлов для С++ (.h + .lib), в масм я полез с голым .lib-файлом, по понятным причинам.
    4. Тут мой косяк, да последний вызов выглядит так:
    Код (Text):
    1. push 100
    2. push 300
    3. call __imp__glVertex2f@8
    Хотя это тоже не рисуется, просто неверно востановил код после перетасовок.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    дошло :) дык это... окно то у тебя от -1 до 1, какие еще 100-300-400, ты их вообще не увидишь.
    Код (Text):
    1.     .486
    2.     .model flat, stdcall
    3.     option casemap :none
    4.  
    5.     include \masm32\include\windows.inc
    6.     include \masm32\include\gdi32.inc
    7.     include \masm32\include\user32.inc
    8.     include \masm32\include\kernel32.inc
    9.     include \masm32\include\opengl32.inc
    10.  
    11.     includelib \masm32\lib\gdi32.lib
    12.     includelib \masm32\lib\user32.lib
    13.     includelib \masm32\lib\kernel32.lib
    14.     includelib \masm32\lib\opengl32.lib
    15.     includelib \masm32\lib\glu32.lib
    16.     includelib glut32.lib
    17.  
    18. glutInitDisplayMode PROTO: dword
    19. glutInitWindowSize PROTO: dword,:dword
    20. glutCreateWindow PROTO: dword
    21. glutMainLoop PROTO
    22. glutIdleFunc PROTO: dword
    23. glutPostRedisplay PROTO: dword
    24. glutDisplayFunc PROTO: dword
    25. gluOrtho2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    26.  
    27. ;Here my macro for calling some openGL functions
    28. _glcall MACRO name:REQ,p1,p2,p3,p4
    29.     for arg, <p4,p3,p2,p1>
    30.         ifnb <arg>
    31.             db 68h
    32.             dd arg
    33.         endif
    34.     endm
    35.     call name
    36.     ENDM
    37.  
    38. .data
    39. text db 'Assember GLUT32 example',0
    40. ALIGN 4
    41. one dd 1.0
    42. zero dd 0.0
    43. forty dq 400.0
    44.  
    45. .code
    46. display PROC
    47.  
    48. _glcall glClearColor, 0,0,0,1.0
    49. invoke glClear, GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT
    50. invoke glColor3ub, 0, 255, 0
    51. invoke glBegin, GL_POLYGON
    52.  
    53. invoke glVertex2i, 100,100
    54. invoke glVertex2i, 100,300
    55. invoke glVertex2i, 300,300
    56. invoke glVertex2i, 300,100
    57. call glEnd
    58. call glFinish
    59. retn
    60. display EndP
    61.  
    62. start:
    63. invoke glutInitDisplayMode, 0
    64. invoke glutInitWindowSize, 400,400
    65. invoke glutCreateWindow, offset text
    66. invoke glutDisplayFunc, offset display
    67.  
    68. invoke glMatrixMode, GL_PROJECTION
    69. invoke glLoadIdentity
    70. push dword ptr[forty+4]
    71. push dword ptr[forty]
    72. push 0
    73. push 0
    74. push dword ptr[forty+4]
    75. push dword ptr[forty]
    76. push 0
    77. push 0
    78. call gluOrtho2D     ; 0, 400.0, 0, 400.0
    79.  
    80. call glutMainLoop
    81. end start
    почувствуй разницу
     
  5. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    В glut есть еще функция.. точно не помню, вроде InitMainArgs или InitArgs.
    вобщем, принимает кол-во аргументов командной строки и указатель на массив
    указателей на строки (пропарсенные аргументы). Её обязательно использовать?
     
  6. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    FatMoon - мои благодарности, разницу ощутил, ошибки тоже свои, сейчас пытаюсь накодять нечто вроде демосцены.