Текстурирование хоботических объектов
Пример текстурирования тора шахматной доской: дополняем функцию построения тора вычислением и наложением текстурных координат, этот алгоритм практически одинаков для всех объектов, построенных из четырехугольников. Для каждого элементарного четырехугольника код расчета и наложения текстурных координат:
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
Результат текстурирования: