|
|
发表于 2006-12-11 20:15:00
|
显示全部楼层
Re:求纹理映谢的算法
//build texture properties
int fp_u1=0,fp_v1=0;
int fp_dyu=0, fp_dyv=0, fp_dxu=0, fp_dxv=0;
int currentTexelIndex=0, textureWidth=0 , textureHeight=0;
if(texture2DEnable)
{
fp_u1=pointProperties[currentPointBufferIndex][vertexIndex0*2+0+1];//<<16;
fp_v1=pointProperties[currentPointBufferIndex][vertexIndex0*2+1+1];//<<16;
int fp_u2=pointProperties[currentPointBufferIndex][vertexIndex1*2+0+1];//<<16;
int fp_v2=pointProperties[currentPointBufferIndex][vertexIndex1*2+1+1];//<<16;
int fp_u3=pointProperties[currentPointBufferIndex][vertexIndex2*2+0+1];//<<16;
int fp_v3=pointProperties[currentPointBufferIndex][vertexIndex2*2+1+1];//<<16;
System.out.print("textuetest, fp_u1="+fp_u1);
System.out.println(" , fp_v1="+fp_v1+" x1="+x1+" y1="+y1);
System.out.print("textuetest, fp_u2="+fp_u2);
System.out.println(" , fp_v2="+fp_v2+" x2="+x2+" y2="+y2);
System.out.print("textuetest, fp_u3="+fp_u3);
System.out.println(" , fp_v3="+fp_v3+" x3="+x3+" y3="+y3);
/*
int fp_dxab,fp_dyab,fp_dxbc,fp_dybc,fp_dxca,fp_dyca;
int fp_duab,fp_dvab,fp_dubc,fp_dvbc,fp_duca,fp_dvca;
fp_dxab=GETFP(x2-x1);
fp_dyab=GETFP(y2-y1);
fp_dxbc=GETFP(x3-x2);
fp_dybc=GETFP(y3-y2);
fp_dxca=GETFP(x1-x3);
fp_dyca=GETFP(y1-y3);
fp_duab=fp_u2-fp_u1;
fp_dvab=fp_v2-fp_v1;
fp_dubc=fp_u3-fp_u2;
fp_dvbc=fp_v3-fp_v2;
fp_duca=fp_u1-fp_u3;
fp_dvca=fp_v1-fp_v3;
//int fp_dyu, fp_dyv, fp_dxu, fp_dxv;
fp_dyu=FPDIV((FPMUL(fp_duab,fp_dxbc)-FPMUL(fp_dubc,fp_dxab)),(FPMUL(fp_dyab,fp_dxbc)-FPMUL(fp_dybc,fp_dxab)));
fp_dyv=FPDIV((FPMUL(fp_dvab,fp_dxbc)-FPMUL(fp_dvbc,fp_dxab)),(FPMUL(fp_dyab,fp_dxbc)-FPMUL(fp_dybc,fp_dxab)));
fp_dxu=FPDIV((fp_duab-FPMUL(fp_dyu,fp_dyab)),fp_dxab);
fp_dxv=FPDIV((fp_dvab-FPMUL(fp_dyv,fp_dyab)),fp_dxab);
*/
if (((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1))!=0)
{
fp_dyu= ((fp_u2-fp_u1)*(x3-x1) - (fp_u3-fp_u1)*(x2-x1))/ ((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1));
fp_dyv= ((fp_v2-fp_v1)*(x3-x1) - (fp_v3-fp_v1)*(x2-x1))/ ((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1));
System.out.print("textuetest, dxu="+fp_dxu);
System.out.println(", dxv="+fp_dxv);
}else
{
System.out.print("0 error0");
}
/* else
System.out.println("not right1"); */
if((x2-x1)!=0)
{
fp_dxu= ((fp_u2-fp_u1)-(y2-y1)*fp_dyu)/(x2-x1);
fp_dxv= ((fp_v2-fp_v1)-(y2-y1)*fp_dyv)/(x2-x1);
System.out.print("textuetest, dyu="+fp_dyu);
System.out.println(", dyv="+fp_dyv);
}else
{
System.out.print("0 error1");
}
//end of build texture properties build
currentTexelIndex=pointProperties[currentPointBufferIndex][0]-TEXTURE_2D;
textureWidth=textureObject[currentTexelIndex * TEXTURE_OBJECT_ALL +TEXTURE_OBJECT_WIDTH];//texture.getWidth();
textureHeight=textureObject[currentTexelIndex * TEXTURE_OBJECT_ALL +TEXTURE_OBJECT_HEIGHT];//texture.getHeight();
}
......
if(texture2DEnable)
{
//m is x
int fp_u,fp_v;
fp_u=textureTestBetween0to1(((m-x1)*fp_dxu) +((y-y1)*fp_dyu) + fp_u1);
fp_v=textureTestBetween0to1(((m-x1)*fp_dxv) +((y-y1)*fp_dyv )+fp_v1);
// System.out.println("fp_u="+fp_u);
// System.out.println("fp_v="+fp_v);
/* try{
Thread.sleep(200);
}catch(Exception xxx){} */
int ui=GETINT(FPMUL(GETFP(textureWidth),fp_u));
int vi=GETINT(FPMUL(GETFP(textureHeight),fp_v));
if(ui==textureWidth)
{
ui--;
}
if(vi==textureWidth)
{
vi--;
}
// System.out.println("ui="+ui);
// System.out.println("vi="+vi);
int color=texelBuffer[currentTexelIndex][(ui)+(vi)*textureWidth];//textureData[ui+vi*textureWidth];
// if((color&0x00ffffff)==0xffffff)
// {
// System.out.println("error coolor="+0xffffffff);
// }
//System.out.println(color);
if((color&0xff000000)==0xff000000)
setPexel(m,y,(color&0x00ffffff));
// sout("fillTriangle color ok");
/*
textureTest(x1,y1,
x2,y2,
x3,y3,
textureCoordinate[vertexIndex0*2+0], textureCoordinate[vertexIndex0*2+1],
textureCoordinate[vertexIndex1*2+0], textureCoordinate[vertexIndex1*2+1],
textureCoordinate[vertexIndex2*2+0], textureCoordinate[vertexIndex2*2+1],
textureData,
m,y);
*/
}
不保证准确。。。我用的不是指数性浮点数 |
|