;формат 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-> удачно соберается, НО за место нужно изображения появляется "КАША". ПОЩАМУ