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

Текстурирование хоботических объектов

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

finit
fild[i]

fidiv[XYParts]
fst[tx0]
fild[i]
fadd[dFloat1]
fidiv[ZParts]
fst[tx1]

finit
fild[j]
fidiv[XYParts]
fst[ty0]
fild[j]
fadd[dFloat1]
fidiv[XYParts]
fst[ty1]
invoke glBegin,FillType

invoke glTexCoord2f,tx0,ty0
invoke glNormal3f,x0n,y0n,zn
invoke glVertex3f,x0,y0,z

invoke glTexCoord2f,tx1,ty0
invoke glNormal3f,x1n,y1n,zn
invoke glVertex3f,x1,y1,z

invoke glTexCoord2f,tx1,ty1
invoke glNormal3f,x3n,y3n,z1n
invoke glVertex3f,x3,y3,z1

invoke glTexCoord2f,tx0,ty1
invoke glNormal3f,x2n,y2n,z1n
invoke glVertex3f,x2,y2,z1

invoke glEnd

Функция создания текстурированного тора, последнее передаваемое функции значение - номер текстуры:

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

Torus PROC ListNumber:DWORD,Radius:DWORD,XYParts:DWORD,ZParts:DWORD,FillType:DWORD,nTxtr:DWORD

LOCAL XYStep:DWORD,ZStep:DWORD
LOCAL i:DWORD,j:DWORD,fi:DWORD,fj:DWORD
LOCAL c0:DWORD,c1:DWORD,r:DWORD,r1:DWORD,z:DWORD,z1:DWORD,b:DWORD,b1:DWORD
LOCAL a0:DWORD,a1:DWORD,tmpx0:DWORD,tmpx1:DWORD,tmpy0:DWORD,tmpy1:DWORD
LOCAL tx0:DWORD,ty0:DWORD,tx1:DWORD,ty1:DWORD
LOCAL x0:DWORD,y0:DWORD,x1:DWORD,y1:DWORD
LOCAL x2:DWORD,y2:DWORD,x3:DWORD,y3:DWORD
LOCAL x0n:DWORD,y0n:DWORD,x1n:DWORD,y1n:DWORD,zn:DWORD,z1n:DWORD
LOCAL x2n:DWORD,y2n:DWORD,x3n:DWORD,y3n:DWORD,z2n:DWORD,z3n:DWORD

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glBindTexture,GL_TEXTURE_2D,nTxtr
invoke glEnable,GL_TEXTURE_2D

fldpi
fmul[dva]
fidiv[XYParts]
fst[XYStep]
mov eax,XYParts
dec eax
mov fi,eax

mov eax,ZParts
dec eax
mov fj,eax

fldpi
fmul[dva]
fidiv[ZParts]
fst[ZStep]

mov i,0
newcicle:

fld[XYStep]
fimul[i]
fst[a0]
fadd[XYStep]
fst[a1]

fld[a0]
fcos
fst[tmpx0]

finit

fld[a0]
fsin
fst[tmpy0]

fld[a1]
fcos
fst[tmpx1]

fld[a1]
fsin
fst[tmpy1]

invoke glEnable,GL_NORMALIZE

mov j,0

newline:

fld[ZStep]
fimul[j]
fst[b]
fcos
fst[c0]

mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c0]
fadd DWORD PTR [eax]
fst[r]

finit

fld[b]

fsin
fst[zn]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z]

fld[b]
fadd[ZStep]
fst[b1]
fcos
fst[c1]

mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c1]

fadd DWORD PTR [eax]
fst[r1]

finit
fld[b1]
fsin
fst[z1n]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z1]

finit
fld[tmpx0]
fmul[r]
fst[x0]

fld[tmpy0]
fmul[r]
fst[y0]

finit
fld[tmpx1]
fmul[r]
fst[x1]

fld[tmpy1]
fmul[r]
fst[y1]

finit
fld[tmpx0]
fmul[r1]
fst[x2]

fld[tmpy0]
fmul[r1]
fst[y2]

finit
fld[tmpx1]
fmul[r1]
fst[x3]

fld[tmpy1]
fmul[r1]
fst[y3]

finit
fld[tmpx0]
fmul[c0]
fst[x0n]

fld[tmpy0]
fmul[c0]
fst[y0n]

finit
fld[tmpx1]
fmul[c0]
fst[x1n]

fld[tmpy1]
fmul[c0]
fst[y1n]

finit
fld[tmpx0]
fmul[c1]
fst[x2n]

fld[tmpy0]
fmul[c1]
fst[y2n]

finit
fld[tmpx1]
fmul[c1]
fst[x3n]

fld[tmpy1]
fmul[c1]
fst[y3n]

finit
fild[i]

fidiv[XYParts]
fst[tx0]
fild[i]
fadd[dFloat1]
fidiv[ZParts]
fst[tx1]

finit
fild[j]
fidiv[XYParts]
fst[ty0]
fild[j]
fadd[dFloat1]
fidiv[XYParts]
fst[ty1]
invoke glBegin,FillType

invoke glTexCoord2f,tx0,ty0
invoke glNormal3f,x0n,y0n,zn
invoke glVertex3f,x0,y0,z

invoke glTexCoord2f,tx1,ty0
invoke glNormal3f,x1n,y1n,zn
invoke glVertex3f,x1,y1,z

invoke glTexCoord2f,tx1,ty1
invoke glNormal3f,x3n,y3n,z1n
invoke glVertex3f,x3,y3,z1

invoke glTexCoord2f,tx0,ty1
invoke glNormal3f,x2n,y2n,z1n
invoke glVertex3f,x2,y2,z1

invoke glEnd
inc j
mov ecx,fj
cmp ecx,j

jge newline

inc i
mov ecx,fi
cmp ecx,i
jge newcicle

invoke glEndList
invoke glDisable,GL_NORMALIZE
invoke glDisable,GL_TEXTURE_2D
ret
Torus ENDP
; #########################################################################

В функцию загрузки текстуры вносим дополнения, позволяющие задать взаимодействие текстуры и поверхности объекта и определение цветов текстуры:

; #########################################################################
LoadTexture PROC flName:DWORD,txtrMode:DWORD,colorMode:DWORD

LOCAL hPic:DWORD,numTxtr:DWORD

invoke Load_Image,flName
mov hPic,eax

invoke glGenTextures,1,ADDR numTxtr
invoke glBindTexture,GL_TEXTURE_2D,numTxtr
invoke glTexEnvi,GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,txtrMode
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,colorMode,GL_UNSIGNED_BYTE,hPic

mov eax,numTxtr
ret
LoadTexture ENDP
; #########################################################################

Текстурированный тор создается в процедуре CreateObjects последовательным вызовом функций:

invoke LoadTexture,ADDR szFileName,GL_MODULATE,GL_BGR_EXT
invoke Torus,1,ADDR ObjectRadius,24,24,GL_QUADS,1

Результат текстурирования:

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

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