- 积分
- 23
- 帖子
- 14
- 主题
- 3
- 精华
- 0
- 最后登录
- 2011-11-18
- 在线时间
- 4 小时
- 私信
|
发表时间 : 2011-3-16 11:28:59
|
浏览 : 822 评论 : 2
vega api和perfermor结合来实现纹理替换,以下是我的实现方法。首先注册回调函数ReDraw。
void ReDraw()
{
pfPushState();
pfPushMatrix();
pfBasicState();
glDisable(GL_DEPTH_TEST); //不要深度检测
glDisable( GL_CULL_FACE );
pfDisable( PFEN_LIGHTING );
pfEnable( PFEN_TEXTURE );
pfTransparency(PFTR_ON);
glEnable(GL_TEXTURE_2D);
LoadTextures();//LoadTextures()主要实现将图像数据拷贝到内存中,pfTexImage生成纹理图像,然后pfApplyTex绑定纹理
gstate = pfNewGState (vgGetSharedArena());
pfGStateMode (gstate, PFSTATE_ALPHAFUNC, PFAF_NOTEQUAL);
pfGStateMode (gstate, PFSTATE_ENTEXTURE, PF_ON);
pfGStateMode (gstate, PFSTATE_ENTEXMAT, 1);
pfGStateMode (gstate, PFSTATE_ENLIGHTING, 0);
pfGStateMode(gstate,PFSTATE_TRANSPARENCY,PF_ON);
pfGStateMode (gstate, PFSTATE_CULLFACE, PFCF_OFF);
pfGStateVal (gstate, PFSTATE_ALPHAREF, 0.0f);
pfApplyGState(gstate);
pfGStateAttr (gstate, PFSTATE_TEXTURE, pftex);//关联对象状态和新纹理指针
tev = pfNewTEnv (vgGetSharedArena());
pfApplyTEnv(tev);
pfGStateAttr (gstate, PFSTATE_TEXENV, tev);
gset = pfNewGSet(vgGetSharedArena());
pfGSetPrimType(gset, PFGS_QUADS);
pfGSetNumPrims(gset, 1);
pfGSetGState (gset, gstate);//关联pfGeoSet和pfGeoState
geode = pfNewGeode();
pfAddGSet(geode, gset);
glEnable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
pfEnable(PFEN_LIGHTING);
pfPopMatrix();
pfPopState();
glEnable(GL_DEPTH_TEST);
}
int main(int argc, char* argv[])
{
.............
OpenTextures();
pftex = pfNewTex( vgGetSharedArena() );
imgSize=mImage->sizeX*mImage->sizeY*3*sizeof(char);
buffer = (char*) pfMalloc(imgSize ,vgGetSharedArena()); //一定要从Vega内存共享区申请内存空间
vgAddFunc( chan, VGCHAN_PREDRAW, ReDraw, NULL );
.......................
vgDelFunc(chan, VGCHAN_PREDRAW, ReDraw, NULL);
...................
}
可是程序运行下来后发现没有纹理显示。 |
|