MASM32 и OpenGL
Это не так сложно, как на самом деле

Функции создания графических примитивов

Простые геометрические объекты (примитивы) удобнее создавать с помощью функций, обращаясь к этим функциям по мере необходимости. Переделаем код примера с белым треугольником. Добавим в файл opngl.asm функции CreateObjects для создания объектов:

; #########################################################################
CreateObjects PROC ParentW:DWORD,ParentH:DWORD

invoke SolidTriangle,1
invoke glMatrixMode,GL_PROJECTION
ret

CreateObjects ENDP
; #########################################################################

и SolidTriangle для сплошного треугольника:

; #########################################################################
SolidTriangle proc ListNumber:DWORD

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glBegin,GL_TRIANGLES
top(Top1)

top(Top2)

top(Top3)

invoke glEnd
invoke glEndList


ret
SolidTriangle endp

; #########################################################################

В определения прототипов впишем:

CreateObjects PROTO :DWORD,:DWORD
SolidTriangle PROTO :DWORD

В процедуру Init:

invoke CreateObjects,WINRect.right,WINRect.bottom

В секцию макросов файла opengl.inc добавим два новых макроса: top строит вершины, put2scene выводит объекты на экран:

top MACRO arg
lea eax,arg
invoke glVertex3f,[eax],[eax+4],[eax+8]
ENDM

put2scene MACRO num,arg
invoke glPushMatrix
lea eax,arg
mov ecx,[eax]
mov ebx,[eax+4]
mov eax,[eax+8]

invoke glTranslatef,ecx,ebx,eax
invoke glCallList,num
invoke glPopMatrix
ENDM

Полностью opngl.asm теперь выглядит так:

; #########################################################################

.data
MainHDC dd 0
OpenDC dd 0

PixFrm PIXELFORMATDESCRIPTOR <>


Position dd 0.0,0.0,-5.0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Top1 dd -1.0,-1.0,0.0
Top2 dd 1.0,-1.0,0.0
Top3 dd 0.0,1.0,0.0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Float45 dq 45.0
Float3 dq 3.0
Float9 dq 9.0
Float1 dq 1.0

.code
ResizeObject PROTO :DWORD,:DWORD
DrawScene PROTO
Init PROTO :DWORD
CreateObjects PROTO :DWORD,:DWORD
SolidTriangle PROTO :DWORD
; #########################################################################

ResizeObject PROC ParentW:DWORD,ParentH:DWORD
invoke glViewport,0,0,ParentW,ParentH
invoke glMatrixMode,GL_PROJECTION
invoke glLoadIdentity
invoke gluPerspective,DWORD PTR Float45,DWORD PTR Float45+4,DWORD PTR Float1,DWORD PTR Float1+4,DWORD PTR Float3,DWORD PTR Float3+4,DWORD PTR Float9,DWORD PTR Float9+4
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
ret
ResizeObject ENDP

; #########################################################################
CreateObjects PROC ParentW:DWORD,ParentH:DWORD

invoke SolidTriangle,1
invoke glMatrixMode,GL_PROJECTION
ret

CreateObjects ENDP
; #########################################################################

DrawScene PROC


invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT

put2scene 1,Position

invoke SwapBuffers,MainHDC
ret
DrawScene ENDP
; #########################################################################
SolidTriangle proc ListNumber:DWORD

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glBegin,GL_TRIANGLES
top(Top1)

top(Top2)

top(Top3)

invoke glEnd
invoke glEndList

ret
SolidTriangle endp

; #########################################################################
Init proc hWn:DWORD
LOCAL WINRect:RECT
LOCAL PixFormat:DWORD

invoke GetDC,hWn
mov MainHDC,eax
mov ax,SIZEOF PixFrm
mov PixFrm.nSize,ax
mov PixFrm.nVersion,1
mov PixFrm.dwFlags,PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
mov PixFrm.dwLayerMask,PFD_MAIN_PLANE
mov PixFrm.iPixelType,PFD_TYPE_RGBA
mov PixFrm.cColorBits,8
mov PixFrm.cDepthBits,16
mov PixFrm.cAccumBits,0
mov PixFrm.cStencilBits,0
invoke ChoosePixelFormat,MainHDC,ADDR PixFrm
mov PixFormat,eax
invoke SetPixelFormat,MainHDC,PixFormat,ADDR PixFrm
or eax,eax
jz Fail
invoke wglCreateContext,MainHDC
mov OpenDC,eax
invoke wglMakeCurrent,MainHDC,OpenDC
invoke GetClientRect,hWn,ADDR WINRect

invoke CreateObjects,WINRect.right,WINRect.bottom
invoke glEnable,GL_COLOR_MATERIAL

jmp abrt
Fail:
invoke MessageBox,hWn,SADD("OpenGL инициализировaть не удалось"),SADD("Отчет об инициализации"),MB_OK

abrt:

return 0

Init endp
; ########################################################

Программа покажет белый треугольник.

Скачать исходники и ехе-файл.

©   Короленко М.В., 2011       
Перепечатка материалов возможна только после согласования с автором при условии обязательной ссылки на сайт