Substract texture from other October 26, 2009 03:04PM | Registered: 15 years ago Posts: 54 |
Re: Substract texture from other October 26, 2009 05:31PM | Registered: 15 years ago Posts: 73 |
/* Stage 1: read the 1st texture color and output to GX_TEVPREV */ GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); /* Stage 2: read the 2nd texture color, subtract it from the 1st color, output to GX_TEVPREV */ GX_SetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE1, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE1, GX_CC_TEXC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_CPREV);I assumed you have different textures, but if you're only changing the texture coordinates for the same texture, you don't need to load the same texture twice. For this scenario, you need to change GX_SetTevOrder() line in stage 2 and specify GX_TEXMAP0.
Re: Substract texture from other October 26, 2009 09:44PM | Registered: 15 years ago Posts: 54 |
GX_SetNumTexGens(2); // The simple map GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0); guLightPerspective(mv,45, (f32)rmode->viWidth/rmode->viHeight, 1.05F, 1.0F, 0.0F, 0.0F); guMtxTrans(mv2, 0.0F, 0.0F, 0.0F); guMtxConcat(mv, mv2, mv); GX_LoadTexMtxImm(mv, GX_TEXMTX0, GX_MTX2x4); // The displacement map GX_SetTexCoordGen(GX_TEXCOORD1,GX_TG_MTX2x4,GX_TG_BUMP0 , GX_TEXMTX1); guLightPerspective(mr,45, (f32)rmode->viWidth/rmode->viHeight, 1.05F, 1.0F, 0.0F, 0.0F); guMtxTrans(mr2, 0.0F, 0.0F, 0.0F); guMtxConcat(mr, mr2, mr); GX_LoadTexMtxImm(mr, GX_TEXMTX1, GX_MTX2x4); /*Load the textures*/ GX_LoadTexObj(&texture[1], GX_TEXMAP0); //simple map GX_LoadTexObj(&texture[2], GX_TEXMAP1);// displacement map while(1){ Light(....); //your code /* Stage 1: read the 1st texture color and output to GX_TEVPREV */ GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); /* Stage 2: read the 2nd texture color, subtract it from the 1st color, output to GX_TEVPREV */ GX_SetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE1, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE1, GX_CC_TEXC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_CPREV); GX_SetNumTevStages(2); GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); GX_SetTevOp(GX_TEVSTAGE1, GX_REPLACE); ......other model data....... }
Re: Substract texture from other October 26, 2009 10:21PM | Registered: 15 years ago Posts: 73 |
Re: Substract texture from other October 27, 2009 12:47PM | Registered: 15 years ago Posts: 22 |
Re: Substract texture from other October 27, 2009 05:13PM | Registered: 15 years ago Posts: 54 |
Quote
Michael
Hi copete23,
You don't need this:GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); GX_SetTevOp(GX_TEVSTAGE1, GX_REPLACE);Take a look at the source code for GX_SetTevOp() in gx.c. This function calls GX_SetTevColorOp() and GX_SetTevColorIn(), so you're undoing what you just setup.
Mtx disp; Mtx mat; guMtxScale(disp,1.0,1.0,1.0); GX_LoadTexMtxImm(disp, GX_TEXMTX0, GX_MTX2x4); GX_SetTexCoordGen(GX_TEXCOORD0,GX_TG_MTX2x4,GX_TG_TEX0,GX_TEXMTX0); // tex coords for displacement texture generated from vertex texcoord data GX_SetTexCoordGen(GX_TEXCOORD1,GX_TG_BUMP0,GX_TG_TEXCOORD0,GX_IDENTITY); // tex coords for displacement texture for emboss bump mapping guMtxScale(mat,1.0,1.0,1.0); GX_LoadTexMtxImm(mat, GX_TEXMTX1, GX_MTX3x4); GX_SetTexCoordGen(GX_TEXCOORD2,GX_TG_MTX3x4,GX_TG_TEX0,GX_TEXMTX1); // tex coord for material texture GX_LoadTexObj(&texture[2], GX_TEXMAP0); GX_LoadTexObj(&texture[1], GX_TEXMAP1); while(1){ Light(....); GXColor color={0,0,0,0}; GX_SetTevColor(GX_TEVREG0,color); //TEVREG0 with only alpha value set is used here to scale/bump the displacement. GX_SetNumTevStages(3); GX_SetTevOrder(GX_TEVSTAGE0,GX_TEXCOORD0,GX_TEXMAP0,GX_COLOR0A0); GX_SetTevColorOp(GX_TEVSTAGE0,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_FALSE,GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE0,GX_CC_ZERO,GX_CC_TEXC,GX_CC_A0,GX_CC_RASC); GX_SetTevOrder(GX_TEVSTAGE1,GX_TEXCOORD1,GX_TEXMAP0,GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE1,GX_TEV_SUB,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE1,GX_CC_ZERO,GX_CC_TEXC,GX_CC_A0,GX_CC_CPREV); GX_SetTevOrder(GX_TEVSTAGE2,GX_TEXCOORD2,GX_TEXMAP1,GX_COLORNULL); GX_SetTevColorOp(GX_TEVSTAGE2,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV); GX_SetTevColorIn(GX_TEVSTAGE2,GX_CC_ZERO,GX_CC_TEXC,GX_CC_CPREV,GX_CC_ZERO) guMtxIdentity(model); guMtxRotAxisDeg(model, &cubeAxis, rquad); guMtxTransApply(model, model, 0.0f,0.0f,zt-4.0f); guMtxConcat(view,model,modelview); // load the modelview matrix into matrix memory GX_LoadPosMtxImm(modelview, GX_PNMTX0); //guMtxInverse(modelview,mvi); //guMtxTranspose(mvi,modelview); GX_LoadNrmMtxImm(disp, GX_PNMTX0); // this is ok? LoadCube(); Render(); } Render(){ GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); GX_SetColorUpdate(GX_TRUE); GX_SetAlphaUpdate(GX_TRUE); GX_CopyDisp(frameBuffer[fb],GX_TRUE); GX_DrawDone(); VIDEO_SetNextFramebuffer(frameBuffer[fb]); if(first_frame) { first_frame = 0; VIDEO_SetBlack(FALSE); } VIDEO_Flush(); VIDEO_WaitVSync(); fb ^= 1; }
Re: Substract texture from other October 28, 2009 09:53AM | Registered: 15 years ago Posts: 22 |
Re: Substract texture from other October 28, 2009 03:14PM | Registered: 15 years ago Posts: 54 |
Re: Substract texture from other October 28, 2009 05:53PM | Registered: 15 years ago Posts: 22 |
Re: Substract texture from other October 28, 2009 07:34PM | Registered: 15 years ago Posts: 54 |