Текстуры
В 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
На следующих страницах - практические примеры.