;выберем для преобразований матрицу перспективной проекции
invoke glMatrixMode,GL_PROJECTION
;умножим ее на матрицу перспективы, т.е. попросту включим ее (используем макрос glcall т.к. параметры передаются в виде 8 байтов)
glcall gluPerspective,90.0,ratio,0.1,100.0
;выберем для преобразований матрицу изображения
invoke glMatrixMode,GL_MODELVIEW
;основной цикл
.draw:
;получаем текущее значение счетчика начала работы Windows (для синхронизации)
invoke GetTickCount
;сравним его с сохраненным значением
cmp eax,[msec]
;если оно не изменилось то ждем
jz .draw
;если значение поменялось сохраним его
mov [msec],eax
;очистим буффер экрана
invoke glClear,GL_COLOR_BUFFER_BIT
;обнулим текущую матрицу (матрицу изображения)
invoke glLoadIdentity
;отодвинем объекты в глубь экрана (z=-3.5)
invoke glTranslatef,ebx,ebx,-3.5
;последовательно умножим матрицу изображения на матрицы поворота (повернем все объекты сцены на угол theta относительно векторов x,y,z соответственно)
invoke glRotatef,[theta],1.0,ebx,ebx
invoke glRotatef,[theta],ebx,1.0,1.0
invoke glRotatef,[theta],ebx,ebx,1.0
;начало рисования куба из 6 четырехугольников GL_QUADS (каждые 4 точки glVertex описывают один четырехугольник)
invoke glBegin,GL_QUADS
;нормаль 1-го четырехугольника
invoke glNormal3f,0.0,0.0,1.0
;координата текстуры для 1-ой вершины
invoke glTexCoord2f,0.0,1.0
;1-я вершина
invoke glVertex3f,-1.0,-1.0,1.0
;координата текстуры для 2-ой вершины
invoke glTexCoord2f,1.0,1.0
;2-я вершина
invoke glVertex3f,1.0,-1.0,1.0
;и т.д.
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,1.0
;нормаль 2-го четырехугольника
invoke glNormal3f,0.0,0.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
;нормаль 3-го четырехугольника
invoke glNormal3f,0.0,1.0,0.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,1.0,1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
;нормаль 4-го четырехугольника
invoke glNormal3f,0.0,-1.0,0.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,-1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,-1.0,1.0
;нормаль 5-го четырехугольника
invoke glNormal3f,1.0,0.0,0.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,1.0,-1.0,1.0
;нормаль 6-го четырехугольника
invoke glNormal3f,-1.0,0.0,0.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,-1.0,-1.0,1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,-1.0,1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
;конец рисования куба
invoke glEnd
;отобразим буффер на экран
invoke SwapBuffers,ebp
;загрузим значение угла theta
fld [theta]
;увеличим его на значение delta
fadd [delta]
;и запишем обратно
fstp [theta]
;проверим на нажатие клавиши ESC
invoke GetAsyncKeyState,VK_ESCAPE
;если она не нажата
test eax,eax
;то продолжим цикл
jz .draw
;выход из программы
invoke ExitProcess,ebx
;значение приращения угла поворота
delta dd 0.3
;заголовок окна
szTitle db 'OpenGL tutorial by Tyler Durden - Alpha blending',0
;имя предопределенного класса окна
szClass db 'edit',0
;включим файл с описанием импорта
data import
include 'imports.inc'
end data
;описание ресурсов
data resource
directory RT_ICON,icons,RT_GROUP_ICON,group_icons
resource icons,1,LANG_NEUTRAL,icon_data
resource group_icons,1,LANG_NEUTRAL,icon
icon icon,icon_data,'blending.ico'
resdata texture
file 'prehistorik.raw'
endres
end data
;счетчик тиков таймера
msec dd ?
;угол поворота
theta dd ?
;соотношение резрешений экрана по горизонтали и вертикали
ratio dq ?
;дескриптор пиксельного формата
pfd PIXELFORMATDESCRIPTOR</span>
;формат exe файла
format PE GUI 4.0
;точка входа программы
entry start
;включаем файлы API процедур (должна быть установлена переменная окружения "fasminc")
include 'win32a.inc'
;констант OpenGL
include 'opengl_const.inc'
;и макросов
include 'opengl_macros.inc'
;начало программы
start:
;обнулим ebx. Т.к. он не изменяется API процедурами то будем использывать push ebx вместо push 0, для оптимизации
xor ebx,ebx
;спрячим курсор
invoke ShowCursor,ebx
;поместим в стек 4-е "0" для процедуры "CreateWindowEx"
push ebx
push ebx
push ebx
push ebx
;получим текущее разрешение по вертикали
invoke GetSystemMetrics,SM_CYSCREEN
;поместим его в стек для процедуры "CreateWindowEx"
push eax
;и по горизонтали
invoke GetSystemMetrics,ebx
;и его в стек
push eax
;вычислим соотношение резрешений экрана по горизонтали и вертикали
fild dword [esp]
fidiv dword [esp+4]
;и сохраним его в ratio
fstp [ratio]
;создадим окно размером с экран с предопределенным классом "edit" (т.к. его регистрировать ненадо, то это позволяет избавиться от не нужного кода)
invoke CreateWindowEx,WS_EX_TOPMOST,szClass,szTitle,WS_VISIBLE+WS_POPUP,ebx,ebx
;получим контекст окна
invoke GetDC,eax
;сохраним его в ebp
xchg ebp,eax
;инициализируем дескриптор формата пикселей OpenGL (поддержку OpenGL и двойной буферизации)
mov [pfd.dwFlags],PFD_DRAW_TO_WINDOW+PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER
;тип пикселей RedGreenBlueAlpha
mov [pfd.iPixelType],PFD_TYPE_RGBA
;глубину цвета
mov [pfd.cColorBits],32
;плоскость отображения
mov [pfd.dwLayerMask],PFD_MAIN_PLANE
;выберем его
invoke ChoosePixelFormat,ebp,pfd
;и установим его
invoke SetPixelFormat,ebp,eax,pfd
;преобразуем контекст окна в контекст OpenGL
invoke wglCreateContext,ebp
;и сделаем его текущим
invoke wglMakeCurrent,ebp,eax
;выберем режим работы альфа смешивания
invoke glBlendFunc,GL_SRC_ALPHA,GL_ONE
;и включим его
invoke glEnable,GL_BLEND
;включим источник света GL_LIGHT0 (используя значения по умолчанию)
invoke glEnable,GL_LIGHT0
;включим освещение
invoke glEnable,GL_LIGHTING
;включим режим совмещения текстуры с цветом объекта
invoke glEnable,GL_COLOR_MATERIAL
;создадим 256x256x24bpp текстуру из ресурса texture (raw файл)
invoke glTexImage2D,GL_TEXTURE_2D,ebx,3,256,256,ebx,GL_RGB,GL_UNSIGNED_BYTE,texture+16
;установим фильтр текстуры при уменьшении (linear)
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
;установим фильтр текстуры при увеличении (linear)
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
;включим текстурирование
invoke glEnable,GL_TEXTURE_2D
;выберем режим вычисления перспективных преобразований (наилучший)
invoke glHint,GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST
;выберем для преобразований матрицу перспективной проекции
invoke glMatrixMode,GL_PROJECTION
;умножим ее на матрицу перспективы, т.е. попросту включим ее (используем макрос glcall т.к. параметры передаются в виде 8 байтов)
glcall gluPerspective,90.0,ratio,0.1,100.0
;выберем для преобразований матрицу изображения
invoke glMatrixMode,GL_MODELVIEW
;основной цикл
.draw:
;получаем текущее значение счетчика начала работы Windows (для синхронизации)
invoke GetTickCount
;сравним его с сохраненным значением
cmp eax,[msec]
;если оно не изменилось то ждем
jz .draw
;если значение поменялось сохраним его
mov [msec],eax
;очистим буффер экрана
invoke glClear,GL_COLOR_BUFFER_BIT
;обнулим текущую матрицу (матрицу изображения)
invoke glLoadIdentity
;отодвинем объекты в глубь экрана (z=-3.5)
invoke glTranslatef,ebx,ebx,-3.5
;последовательно умножим матрицу изображения на матрицы поворота (повернем все объекты сцены на угол theta относительно векторов x,y,z соответственно)
invoke glRotatef,[theta],1.0,ebx,ebx
invoke glRotatef,[theta],ebx,1.0,1.0
invoke glRotatef,[theta],ebx,ebx,1.0
;начало рисования куба из 6 четырехугольников GL_QUADS (каждые 4 точки glVertex описывают один четырехугольник)
invoke glBegin,GL_QUADS
;нормаль 1-го четырехугольника
invoke glNormal3f,0.0,0.0,1.0
;координата текстуры для 1-ой вершины
invoke glTexCoord2f,0.0,1.0
;1-я вершина
invoke glVertex3f,-1.0,-1.0,1.0
;координата текстуры для 2-ой вершины
invoke glTexCoord2f,1.0,1.0
;2-я вершина
invoke glVertex3f,1.0,-1.0,1.0
;и т.д.
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,1.0
;нормаль 2-го четырехугольника
invoke glNormal3f,0.0,0.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
;нормаль 3-го четырехугольника
invoke glNormal3f,0.0,1.0,0.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,1.0,1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
;нормаль 4-го четырехугольника
invoke glNormal3f,0.0,-1.0,0.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,-1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,-1.0,1.0
;нормаль 5-го четырехугольника
invoke glNormal3f,1.0,0.0,0.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,1.0,1.0,-1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,1.0,1.0,1.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,1.0,-1.0,1.0
;нормаль 6-го четырехугольника
invoke glNormal3f,-1.0,0.0,0.0
invoke glTexCoord2f,0.0,1.0
invoke glVertex3f,-1.0,-1.0,-1.0
invoke glTexCoord2f,1.0,1.0
invoke glVertex3f,-1.0,-1.0,1.0
invoke glTexCoord2f,1.0,0.0
invoke glVertex3f,-1.0,1.0,1.0
invoke glTexCoord2f,0.0,0.0
invoke glVertex3f,-1.0,1.0,-1.0
;конец рисования куба
invoke glEnd
;отобразим буффер на экран
invoke SwapBuffers,ebp
;загрузим значение угла theta
fld [theta]
;увеличим его на значение delta
fadd [delta]
;и запишем обратно
fstp [theta]
;проверим на нажатие клавиши ESC
invoke GetAsyncKeyState,VK_ESCAPE
;если она не нажата
test eax,eax
;то продолжим цикл
jz .draw
;выход из программы
invoke ExitProcess,ebx
;значение приращения угла поворота
delta dd 0.3
;заголовок окна
szTitle db 'OpenGL tutorial by Tyler Durden - Alpha blending',0
;имя предопределенного класса окна
szClass db 'edit',0
;включим файл с описанием импорта
data import
include 'imports.inc'
end data
;описание ресурсов
data resource
directory RT_ICON,icons,RT_GROUP_ICON,group_icons
resource icons,1,LANG_NEUTRAL,icon_data
resource group_icons,1,LANG_NEUTRAL,icon
icon icon,icon_data,'blending.ico'
resdata texture
file 'prehistorik.raw'
endres
end data
;счетчик тиков таймера
msec dd ?
;угол поворота
theta dd ?
;соотношение резрешений экрана по горизонтали и вертикали
ratio dq ?
;дескриптор пиксельного формата
pfd PIXELFORMATDESCRIPTOR
Первоисточник где-то в Интернете...
Вопрос: Берём пример.jpeg-> конвертируем его в пример.RAW-> заменяем файл crate.raw на пример.raw-> F9-> удачно соберается, НО за место нужно изображения появляется "КАША". ПОЩАМУ