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

Текстуры

В OpenGL нет функций для работы с файлами. Поэтому возникает проблема загрузки рисунка и подготовки его для создания текстуры. Существует несколько форматов файлов рисунков для создания текстур, возьмем для начала самый простой - bmp. Задача формулируется так: а) загрузить рисунок б) подготовить его для создания текстуры в) средствами OpenGL создать текстуру и г) нанести текстуру на объект. Загрузка рисунка и снятие с уже загруженного рисунка заголовка можно осуществить такой функцией:

; #########################################################################
Load_Image proc

LOCAL dwFileSize:DWORD, dwHighSize:DWORD, dwBytesRead:DWORD, hFile:DWORD,bmpheader:DWORD,Memory:DWORD
LOCAL pBits:DWORD

invoke CreateFile, ADDR szFileName, GENERIC_READ, FILE_SHARE_READ, 0, \
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0
mov hFile,eax

invoke GetFileSize, hFile, ADDR dwHighSize
mov dwFileSize, eax

invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, dwFileSize

mov Memory,eax

invoke GlobalLock,Memory
mov bmpheader,eax

mov ebx,bmpheader

invoke ReadFile, hFile, bmpheader, dwFileSize, ADDR dwBytesRead, 0

invoke CloseHandle, hFile

mov eax, dwBytesRead

mov edx,BITMAPFILEHEADER.bfSize[ebx]


mov eax, sizeof BITMAPFILEHEADER
add eax,bmpheader

mov esi,eax

mov eax,BITMAPFILEHEADER.bfOffBits[ebx];
add eax,bmpheader

mov pBits,eax

m2m xPic, BITMAPINFO.bmiHeader.biWidth[esi]
m2m yPic, BITMAPINFO.bmiHeader.biHeight[esi]

return pBits

Load_Image endp
;#####################################################

Имя файла рисунка определяется в секции данных opengl.inc, функция не вызывает диалогового окна открытия файла, а сразу при обращении к ней считывает рисунок:

szFileName db "chessboard.bmp",0

Переменные xPic и уPic необходимо определять как глобальные, потому. что они используются в дальнейшем при создании текстуры. Следует учитывать, что размеры рисунка должны быть кратны степени двойки, примеры допустимых размеров 128х128, 128х256, 256х512 и т.д. Сама текстура создается функцией LoadTexture:

; #########################################################################
LoadTexture PROC
LOCAL hTxtr:DWORD

invoke Load_Image
mov hPic,eax

invoke glGenTextures,1,ADDR hTxtr
invoke glBindTexture,GL_TEXTURE_2D,hTxtr
invoke glTexEnvi,GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
invoke glPixelStorei,GL_UNPACK_ALIGNMENT, 1


invoke gluBuild2DMipmaps,GL_TEXTURE_2D,3,xPic,yPic,GL_RGB,GL_UNSIGNED_BYTE,hPic

ret
LoadTexture ENDP


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

Прототипы этих функций (для однотекстурной заливки):

LoadTexture PROTO
Load_Image PROTO

Функция LoadTexture вызывается в процедуре CreateObjects, вызывает в свою очередь функцию Load_Image и затем из подготовленного этой функцией массива байтов без знака создает текстуру. Перед использование необходимо включить текстуру командой

invoke glEnable,GL_TEXTURE_2D

После окончания использования текстура выключается командой

invoke glDisable,GL_TEXTURE_2D

Для связывания текстуры с объектом и правильного наложения текстуры иногда необходимо задавать координаты текстуры. Это двумерные координаты (текстура плоская), для квадратной текстуры набор координат следующий (задается в секции данных):

Top1 dd 0.0,0.0
Top2 dd 1.0,0.0
Top3 dd 1.0,1.0
Top4 dd 0.0,1.0

Вввод текстурных координат упрощает макрос toptx, в приводимых примерах он находится в секции макросов файла opengl.inc:

toptx MACRO arg
lea eax,arg
invoke glTexCoord2f,[eax],[eax+4]
ENDM

На следующих страницах - практические примеры.

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