|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Yuri Burger 2:468/85.3 22 May 2001 21:04:01 To : Michael Komm Subject : текстурирование (сырэц) -------------------------------------------------------------------------------- 18 May 01 02:11, Michael Komm wrote to All: MK> есть текстура размером tsx на tsy, есть некотрая 4-угольная фигура с MK> координатами вершин в экранных координатах, по какому принципу текстуру Вопервых, лучше юзай треугольники - проще работать. А для треугольника это так: есть 3 точки на экране, каждой соответствует координата в текстуре. Теперь, сортируем эти точки по Y, чтоб сверху вниз было. Потом запоминаем, какие из этих точек образуют наибольшую грань. теперь цикл по Y-разнице этих двух точек. внутри: интерполяцией определяем граници X-отрезка от одной грани к другой, интерполяцией-же определяем координаты этих границ в текстуре. Потом цикл по этому отрезку с всё той-же родимой интерполяцией, где собсна и отрисовуем горизонтальный отрезок. когда одна из коротких граней закончится, подсовуем вторую. И вообще, чё эт я распинаюсь? Hа вот сырец, пользуй: // Guru + Texture Triangle + ZBuffer // выдрано их X-Vga Lib (там только текстурирование в 256х320х200 было // переведено с ASM на PAS, и c PAS на C и дико попорчено by Kruger :) // расчитано на 16-бит режимы, а потому юзает таблицу перекодировки цвета // если выбросить ZBuffer и Guru то вполне шустро бегает void PTTriangle(BTRIANGLE *F) { long MC1,MZ1; long MDC1,MDZ1; long MTX1,MTY1; long MTDX1,MTDY1; long CC1,CZ1; long DC3,DZ3; long TCX1,TCY1; long TDX3,TDY3; long CX1; long DX3; long mbx,mbx1,mbx2,mbx3; long Texture; long Y1,Y2,Y3; long z1,y; word t; long CC2,DC1,DC2; long CZ2,DZ1,DZ2; long CX2,DX1,DX2; long TCX2,TDX1,TDX2; long TCY2,TDY1,TDY2; vertex *a=&F->A; vertex *b=&F->B; vertex *c=&F->C; vertex *tmp; long MX1,MX2; long MC2; long MZ2; long MTX2,MTY2; Texture=(long)F->Texture; if(a->sy > b->sy){tmp=a;a=b;b=tmp;} if(a->sy > c->sy){tmp=a;a=c;c=tmp;} if(b->sy > c->sy){tmp=b;b=c;c=tmp;} CC1=a->cc*32768; CZ1=a->z*32768; TCX1=a->u*32768; TCY1=a->v*512; CX1=a->sx*=32768; Y1=a->sy; b->cc*=32768; b->z*=32768; b->u*=32768; b->v*=512; b->sx*=32768; Y2=b->sy; c->cc*=32768; c->z*=32768; c->u*=32768; c->v*=512; c->sx*=32768; Y3=c->sy; mbx=Y2 - Y1; if(mbx!=0)goto NONFLAT1; DC1=mbx; DZ1=mbx; TDX1=mbx; TDY1=mbx; DX1=mbx; CC2=b->cc; CZ2=b->z; TCX2=b->u; TCY2=b->v; CX2=b->sx; goto OK7; NONFLAT1: DC1=(b->cc - CC1)/mbx; DZ1=(b->z - CZ1)/mbx; TDX1=(b->u - TCX1)/mbx; TDY1=(b->v - TCY1)/mbx; DX1=(b->sx - CX1)/mbx; CC2=CC1; CZ2=CZ1; TCX2=TCX1; TCY2=TCY1; CX2=CX1; OK7: mbx=Y3 - Y2; if(mbx!=0)goto NONFLAT2; DC2=mbx; DZ2=mbx; TDX2=mbx; TDY2=mbx; DX2=mbx; goto OK11; NONFLAT2: DC2=(c->cc - b->cc)/mbx; DZ2=(c->z - b->z)/mbx; TDX2=(c->u - b->u)/mbx; TDY2=(c->v - b->v)/mbx; DX2=(c->sx - b->sx)/mbx; OK11: mbx=Y3 - Y1; if(mbx!=0)goto NONFLAT3; DC3=mbx; DZ3=mbx; TDX3=mbx; TDY3=mbx; DX3=mbx; goto LINELOOP; NONFLAT3: DC3=(c->cc - CC1)/mbx; DZ3=(c->z - CZ1)/mbx; TDX3=(c->u - TCX1)/mbx; TDY3=(c->v - TCY1)/mbx; DX3=(c->sx - CX1)/mbx; LINELOOP: if(CX1>=CX2)goto MUSTSWAP; MC1=CC1; MZ1=CZ1; MTX1=TCX1; MTY1=TCY1; MX1=CX1; MC2=CC2; MZ2=CZ2; MTX2=TCX2; MTY2=TCY2; MX2=CX2; goto OK17; MUSTSWAP: MC1=CC2; MZ1=CZ2; MTX1=TCX2; MTY1=TCY2; MX1=CX2; MC2=CC1; MZ2=CZ1; MTX2=TCX1; MTY2=TCY1; MX2=CX1; OK17: MX1/=32768; MX2/=32768; mbx=(MX2-MX1+1); MDC1=(MC2-MC1)/mbx; MDZ1=(MZ2-MZ1)/mbx; MTDX1=(MTX2-MTX1)/mbx; MTDY1=(MTY2-MTY1)/mbx; y=Y1*512+Y1*128; mbx=y*2+originOffset; mbx3=(y+MX1)*4+(long)ZBuff; mbx1=mbx+MX1*2; mbx2=mbx+MX2*2; LOOP1: z1=*(dword *)(mbx3); if(z1>MZ1) { *(dword *)(mbx3)=MZ1; t=*(word *)((MTY1&0xFFFFFE00)+(MTX1/32768)*2+Texture); *(word *)(mbx1)=GTable[t+(MC1&0xFFFF8000)]; } mbx1+=2; mbx3+=4; MC1+=MDC1; MZ1+=MDZ1; MTX1+=MTDX1; MTY1+=MTDY1; if(mbx1<=mbx2)goto LOOP1; CC1+=DC3; CZ1+=DZ3; TCX1+=TDX3; TCY1+=TDY3; CX1+=DX3; if(Y1 < Y2)goto TOPPART; CC2+=DC2; CZ2+=DZ2; TCX2+=TDX2; TCY2+=TDY2; CX2+=DX2; Y1++; if(Y1 <= Y3)goto LINELOOP; goto EXIT; TOPPART: CC2+=DC1; CZ2+=DZ1; TCX2+=TDX1; TCY2+=TDY1; CX2+=DX1; Y1++; if(Y1 <= Y3)goto LINELOOP; EXIT:; } Kрюгер. --- * Origin: А хто тут есть, у кого есть за что поесть? (2:468/85.3) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/23173b0ad456.html, оценка из 5, голосов 10
|