我要发帖 回复

正式会员

3

主题

23

积分

0

专家分

:

私信
发表时间 : 2011-3-16 11:28:59 | 浏览 : 720    评论 : 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);

...................




可是程序运行下来后发现没有纹理显示。

最近VR访客

zhognjian 评论于2011-3-17 20:37:44
怎么没人回答呢?
唉,自己研究出来了
zhognjian 评论于2011-3-17 20:43:38
vgObject *obj=vgGetObj(0);  
pfNode *node=vgGetObjPfNode( obj );
//geode=(pfGeode *)node;
pfList *list1=vgGetObjPfGSets(obj);
pfList *list2=vgGetObjPfGStates(obj);
//for(int i=0;i<pfGetNum(list1);i++)
//{
        for(int j=0;j<pfGetNum(list2);j++)
        {
                //gset=(pfGeoSet*)pfGet(list1,i);

    gstate=(pfGeoState*)pfGet(list2,j);
    //pfGetNumGSets
        gset = pfNewGSet(vgGetSharedArena());
        //gstate = pfNewGState (vgGetSharedArena());
.....}
要先获取对象的状态,才能改变纹理

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2022-8-13 03:41 PM

返回顶部