Пока сижу дома решил переложить OpenGL-примеры, на masm64 Пример из стандартной поставки FASM, в аттаче Opengl32.inc, Glu32.inc, Glut32.inc, исходный файл и ехе
Текст asm-заготовки для работы с OpenGl Код (ASM): ; GUI # include win64a.inc ; --------------- WINDOWWIDTH = 440 WINDOWHEIGHT = 400 .code WinMain proc local msg:MSG xor ebx,ebx mov edi,offset szClassName mov esi,IMAGE_BASE mov ecx,offset FileName invoke LoadCursorFromFile push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOWTEXT+1;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc;lpfnWndProc push sizeof WNDCLASSEX ;cbSize & style invoke RegisterClassEx,esp ;addr WNDCLASSEX push rbx push rsi ;rsi = 400000h shl esi,9 ;rsi = CW_USEDEFAULT push rbx push rbx push WINDOWHEIGHT push WINDOWWIDTH push rsi push rsi sub esp,20h invoke CreateWindowEx,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_VISIBLE ;цикл сообщений lea edi,msg @@: invoke GetMessage,edi,0,0,0 cmp msg.wParam,VK_ESCAPE;user press 'Esc'? je wmDESTROY invoke DispatchMessage,edi jmp @b WinMain endp WndProc proc hWin:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD mov hWin,rcx cmp edx,WM_CREATE je wmCREATE cmp edx,WM_SIZE je wmSIZE cmp edx,WM_PAINT je wmPAINT cmp edx,WM_DESTROY je wmDESTROY default:leave jmp NtdllDefWindowProc_ wmDESTROY::invoke wglMakeCurrent,0,0 invoke wglDeleteContext,hrc invoke ReleaseDC,hWin,hDC invoke RtlExitUserProcess,NULL wmCREATE:invoke GetDC ;получим контекст окна mov hDC,rax ;инициализируем дескриптор формата пикселей OpenGL (поддержку OpenGL и двойной ;буферизации) выберем его mov edx,offset PixFrm invoke ChoosePixelFormat,eax ;и установим его mov r8d,offset PixFrm invoke SetPixelFormat,hDC,eax ;преобразуем контекст окна в контекст OpenGL invoke wglCreateContext,hDC mov hrc,rax ;и сделаем его текущим invoke wglMakeCurrent,hDC,eax ;выберем режим вычисления перспективных преобразований (наилучший) invoke glHint,GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST; ;выберем для преобразований матрицу перспективной проекции invoke glMatrixMode,GL_PROJECTION;выбирает активную матрицу из списка (стека) ;умножим ее на матрицу перспективы, т.е. попросту включим ее (используем макрос glcall т.к. параметры передаются в виде 8 байтов) movq xmm0,constd90_0 movq xmm1,ratio movq xmm2,constd0_1 movq xmm3,constd100_0 invoke gluPerspective ;выберем для преобразований матрицу изображения invoke glMatrixMode,GL_MODELVIEW;выбирает активную матрицу из списка (стека) jmp wmBYE wmSIZE:; --------------- Resize the scene movzx r8,r9w shr r9,16 invoke glViewport,0,0;Изменение области вывода изображения в окно jmp wmBYE wmPAINT:; No pending messages: draw the scene ; --------------- Display the scene ;очистим буфер экрана invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ;обнулим текущую матрицу (матрицу изображения) invoke glLoadIdentity ;отодвинем объекты в глубь экрана (z=-5 и влево х=-1,5) movd xmm0,const_1_5;ebx movd xmm1,ebx movd xmm2,const_5_0 invoke glTranslatef invoke glFlush ;отобразим буфер на экран invoke SwapBuffers,hDC wmBYE: leave retn WndProc endp hDC dq ? hrc dq ? PixFrm label PIXELFORMATDESCRIPTOR PixFrm label PIXELFORMATDESCRIPTOR nSize dw sizeof PIXELFORMATDESCRIPTOR;размер структуры данных nVersion dw 1;версия структуры данных dwFlags dd PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER or \ PFD_DRAW_TO_WINDOW ;Набор битовых флагов, которые определяют свойства буфера точек iPixelType db PFD_TYPE_RGBA;Требуется RGBA формат cColorBits db 32;Выбирается бит глубины цвета cRedBits db 0 cRedShift db 0 cGreenBits db 0 cGreenShift db 0 cBlueBits db 0 cBlueShift db 0;Игнорирование цветовых битов cAlphaBits db 0;Нет буфера прозрачности cAlphaShift db 0;Сдвиговый бит игнорируется cAccumBits db 0;Нет буфера накопления cAccumRedBits db 0 cAccumGreenBits db 0 cAccumBlueBits db 0 cAccumAlphaBits db 0;Биты накопления игнорируются cDepthBits db 32;32 битный Z-буфер (буфер глубины) cStencilBits db 0;Нет буфера трафарета cAuxBuffers db 0;Нет вспомогательных буферов iLayerType db PFD_MAIN_PLANE;Главный слой рисования bReserved db 0;Зарезервировано dwLayerMask dd 0 dwVisibleMask dd 0 dwDamageMask dd 0;Маски слоя игнорируются szClassName db "Uncle Remus tales:#40 OpenGL",0 FileName db "Images\br_Rabbit3.cur",0 ratio dq 1.1;440/400 const_1_5 dd -1.5 const_5_0 dd -5.0 constd90_0 dq 90.0 constd0_1 dq 0.1 constd100_0 dq 100.0 end собирается bat-файлом Код (Text): cls set masm64_path=\masm43\ set filename=%~n1 if exist errors.txt del errors.txt call :read_settings %filename% @echo %kind_of_file% goto %kind_of_file% :CONSOLE if exist %filename%.exe del %filename%.exe if exist %filename%.obj del %filename%.obj if exist errors.txt del errors.txt %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt if errorlevel 1 exit if exist %1.rc ( %masm64_path%bin\RC /r /i"%masm64_path%\Include" %filename%.rc >> errors.txt %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" ^ /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^ /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^ /fixed /nocoffgrpinfo %filename%.obj %filename%.res >> errors.txt if exist %1.res del %1.res ) else ( %masm64_path%bin\link /SUBSYSTEM:CONSOLE /LIBPATH:"%masm64_path%Lib" ^ /entry:WinMain %filename%.obj /LARGEADDRESSAWARE:NO ^ /ALIGN:16 /SECTION:.text,W /BASE:0x400000 /STUB:%masm64_path%\bin\stubby.exe >> errors.txt ) if errorlevel 1 exit del %filename%.obj goto exit1 :GUI if exist %filename%.exe del %filename%.exe if exist %filename%.obj del %filename%.obj if exist errors.txt del errors.txt %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt if errorlevel 1 exit if exist %1.rc ( %masm64_path%bin\RC /r /i"%masm64_path%\Include" %filename%.rc >> errors.txt %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" ^ /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^ /SECTION:.text,W /ALIGN:16 /entry:WinMain ^ /fixed /nocoffgrpinfo %filename%.obj %filename%.res >> errors.txt if exist %1.res del %1.res ) else ( %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:"%masm64_path%Lib" ^ /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^ /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^ /fixed /nocoffgrpinfo %filename%.obj >> errors.txt ) if errorlevel 1 exit goto exit1 :DLL if exist %filename%.dll del %filename%.dll %masm64_path%bin\ml64 /c /Cp /I %masm64_path%include %filename%.asm >> errors.txt if errorlevel 1 exit if exist %1.rc ( %masm64_path%bin\RC /r %filename%.rc >> errors.txt if errorlevel 1 exit %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^ /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe ^ %filename%.obj %filename%.res /DEF:%filename%.def >> errors.txt if exist %1.res del %1.res ) else ( %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^ /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe ^ %filename%.obj /DEF:%filename%.def >> errors.txt ) if errorlevel 1 exit del %filename%.exp :exit1 del %filename%.obj del errors.txt :: %filename%.exe exit :read_settings for /f "eol=# tokens=2-3" %%A in (%filename%.asm) do ( set kind_of_file=%%A if %%B == # exit /b ) exit /b
Делаем из четырех треугольников вращающейся тетраэдр (пирамида, у которой все грани — равносторонние треугольники), в аттаче исходный файл и ехе
Рисуем треугольник разными типами линий, перемещение, масштабирование и повороты, в аттаче исходный файл и ехе
Переделанный пример из "FASM OpenGL tutorial от Tyler Durden'а" Motion blur — размытие изображения при повороте камеры, воспроизведении сцен движения или быстро движущихся объектов. Рендеринг — процесс получения изображения по модели с помощью компьютерной программы. В аттаче исходный файл, курсор, raw-файл и ехе
Переделанный пример из "FASM OpenGL tutorial от Tyler Durden'а" Текстурование — этап в процессе создания и визуализации 3D модели, позволяющий придать поверхности объекта определенных параметров и свойств, для получения максимальной реалистичности. В аттаче исходный файл, курсор, raw-файл и ехе
Переделанный пример из "FASM OpenGL tutorial от Tyler Durden'а" α-смешивание (blending) — эффект прозрачности. В аттаче исходный файл, курсор, raw-файл и ехе
Mikl___, это очень много 9 728 байт тот же пульс под вин32 --- Сообщение объединено, 30 апр 2020 --- даже вот с картинкой музыкой скролом и то 263 638 байт это очень много
SDK, это демосцена. Оригинал под DOS вообще 256 байт, а SDK 2020.exe пожато чем-то Цитирую Tyler Durden'а Переделанный пример из "FASM OpenGL tutorial от Tyler Durden'а" Ёжик в тумане . В аттаче исходный файл, курсор, raw-файл, opengl32.inc и ехе
Переделанный пример из самоучителя Игоря Тарасова "Основы OpenGL" lamps.c В аттаче исходный файл, курсор и ехе
Программа демонстрирует использование модели освещения GL. Несколько объектов нарисованы с использованием разных характеристик материала. Объекты освещает единственный источник света. В аттаче исходный файл, курсор и ехе. Для расчета положения шариков использовалась таблица x-3,75-1,251,253,75y30-3
graphics library utilities aka glut, это прокладка между чистым opengl и системой, поставляется отдельно --- Сообщение объединено, 3 май 2020 --- https://nehe.gamedev.net/