После освоения библиотеки GLUT32 (на С++), ради интереса решил поэкспериментировать с ассемблером и наткнулся на довольно странную проблему, не все функции глюта работают (тоесть все компилится и экспортируется как показывает отлатчик, но темнемение окно программы пустое), вот простейшый код рисующий квадратик в окошке, но окошко пустое. Код (Text): includelib glut32.lib extern __imp__glutInitDisplayMode@4:dword extern __imp__glutInitWindowSize@8 :dword extern __imp__glutCreateWindow@4:dword extern __imp__glutMainLoop@0 :dword extern __imp__glutIdleFunc@4:dword ;extern __imp__glutInit@8:dword extern __imp__glutPostRedisplay@0:dword extern __imp__glutDisplayFunc@4:dword includelib opengl32.lib extern __imp__glClearColor@16:dword extern __imp__glClear@4:dword extern __imp__glColor3ub@12:dword extern __imp__glFinish@0:dword extern __imp__glColor3ub@12:dword extern __imp__glBegin@4:dword extern __imp__glEnd@0:dword extern __imp__glVertex2f@8:dword .386 .model flat .data text db 'Assember GLUT32 example' public display .code display PROC push 1 push 0 push 0 push 0 call __imp__glClearColor@16 push 4000h call __imp__glClear@4 push 0 push 255 push 0 call __imp__glColor3ub@12 push 9 call __imp__glBegin@4 push 100 push 100 call __imp__glVertex2f@8 push 300 push 100 call __imp__glVertex2f@8 push 300 push 300 call __imp__glVertex2f@8 push 400 push 400 call __imp__glVertex2f@8 call __imp__glEnd@0 call __imp__glFinish@0 retn display EndP .code _start: push 0 call __imp__glutInitDisplayMode@4 push 400 push 400 call __imp__glutInitWindowSize@8 push offset text call __imp__glutCreateWindow@4 push offset display call __imp__glutDisplayFunc@4 call __imp__glutMainLoop@0 end _start Опыты с кодом показали все что между оперативными скобками glBegin() - glEnd(), словно отсутствует почему?
поскольку то, что между 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) - это треугольник с хвостиком, но никак не квадратик.
0. - судя по результату функция сработала правильно, по крайней мере цвет у окна черный, впрочем буду пробывать. 1. - замена на glVertex2i тоже ничего не дает, хотя хвост в @8 насколько я знаю показывает что функция "прохавает" любые две четырехбайтные константы (я не силен в теории написания API поправте меня пожалуйста, если что ). 2. - я как всегда преуспеваю в изобретании велосипедов 3. - у меня была пара файлов для С++ (.h + .lib), в масм я полез с голым .lib-файлом, по понятным причинам. 4. Тут мой косяк, да последний вызов выглядит так: Код (Text): push 100 push 300 call __imp__glVertex2f@8 Хотя это тоже не рисуется, просто неверно востановил код после перетасовок.
дошло дык это... окно то у тебя от -1 до 1, какие еще 100-300-400, ты их вообще не увидишь. Код (Text): .486 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\opengl32.inc includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\opengl32.lib includelib \masm32\lib\glu32.lib includelib glut32.lib glutInitDisplayMode PROTO: dword glutInitWindowSize PROTO: dword,:dword glutCreateWindow PROTO: dword glutMainLoop PROTO glutIdleFunc PROTO: dword glutPostRedisplay PROTO: dword glutDisplayFunc PROTO: dword gluOrtho2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ;Here my macro for calling some openGL functions _glcall MACRO name:REQ,p1,p2,p3,p4 for arg, <p4,p3,p2,p1> ifnb <arg> db 68h dd arg endif endm call name ENDM .data text db 'Assember GLUT32 example',0 ALIGN 4 one dd 1.0 zero dd 0.0 forty dq 400.0 .code display PROC _glcall glClearColor, 0,0,0,1.0 invoke glClear, GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT invoke glColor3ub, 0, 255, 0 invoke glBegin, GL_POLYGON invoke glVertex2i, 100,100 invoke glVertex2i, 100,300 invoke glVertex2i, 300,300 invoke glVertex2i, 300,100 call glEnd call glFinish retn display EndP start: invoke glutInitDisplayMode, 0 invoke glutInitWindowSize, 400,400 invoke glutCreateWindow, offset text invoke glutDisplayFunc, offset display invoke glMatrixMode, GL_PROJECTION invoke glLoadIdentity push dword ptr[forty+4] push dword ptr[forty] push 0 push 0 push dword ptr[forty+4] push dword ptr[forty] push 0 push 0 call gluOrtho2D ; 0, 400.0, 0, 400.0 call glutMainLoop end start почувствуй разницу
В glut есть еще функция.. точно не помню, вроде InitMainArgs или InitArgs. вобщем, принимает кол-во аргументов командной строки и указатель на массив указателей на строки (пропарсенные аргументы). Её обязательно использовать?
FatMoon - мои благодарности, разницу ощутил, ошибки тоже свои, сейчас пытаюсь накодять нечто вроде демосцены.