CG橙子精彩导航: CG橙子搜索引擎 | 博客 | 动画视频
广告|项目|培训|竞价排名  
86CG > CG教程 > 虚拟现实 > Multigen > 用程序显示自己的LOGO

用程序显示自己的LOGO

类型:整理 | 来自:86CG | 时间:2007-11-29 |  点击:
  我们在制作自己的Vega Demo的时候,如何能像Multigen官方那样在屏幕上显示一个自己的LOGO呢?可以使用下面这段VGCHAN_POSTDRAW回调程序:

static void DrawLogo_CB(vgChannel *chan, void *udata ) {
GLint matmode, mm;
GLfloat projmat[16];
GLboolean texstate;
GLboolean cullface;
int trans;
static int first = 1;
static unsigned char *texbuf;
static pfTexture *pftex;
static float alpha = 0.0f;
// 保存当前绘制状态
trans = pfGetTransparency();
glGetBooleanv( GL_CULL_FACE, &cullface);
pfPushState();
// 设置新的绘制状态
pfTransparency( PFTR_FAST );
glDisable( GL_CULL_FACE );
pfDisable( PFEN_LIGHTING );
glGetBooleanv( GL_TEXTURE_2D, &texstate );
if( !texstate ) {
  glEnable( GL_TEXTURE_2D );
}
pfEnable( PFEN_TEXTURE );
// 保存当前投影变换,为显示LOGO设置正交投影变换
pfPushIdentMatrix();
glDisable(GL_DEPTH_TEST);
glGetIntegerv(GL_MATRIX_MODE, &matmode);
glMatrixMode(GL_PROJECTION);
glGetFloatv(GL_PROJECTION_MATRIX, projmat);
glMatrixMode( matmode );
glGetIntegerv(GL_MATRIX_MODE, &mm);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D( 0.0f, 1.0f, 0.0f, 1.0f );
glMatrixMode(mm);
// 创建并加载LOGO纹理
if( first ) {
  char* buffer;
  int imgSize;
  first = 0;
  pftex = pfNewTex( vgGetSharedArena() );
  imgSize = logo_width * logo_height * logo_com * sizeof(char);
  buffer = (char*) pfMalloc(imgSize ,vgGetSharedArena());  //一定要从Vega内存共享区申请内存空间
  memcpy(buffer,logo_image_data,imgSize);   //将图像数据拷贝到申请的内存中
  pfTexImage( pftex, (unsigned int *)(buffer), logo_com, logo_width, logo_width,1 );  // 创建新的纹理备用
  pfTexFilter( pftex, PFTEX_MINFILTER, PFTEX_BILINEAR );
  pfTexFilter( pftex, PFTEX_MAGFILTER, PFTEX_BILINEAR );
  //其中:logo_width 为logo图像的宽度,logo_height为logo像素的高度 ,logo_com为图像的像素深度rgb=3 rgba=4
  //logo_image_data为指向logo图像数据的指针
}
// 将纹理映射到屏幕左下角的多边形上成为LOGO
else {
  pfApplyTex( pftex );  //将其邦定为OpenGl的当前纹理
  // LOGO渐渐出现
  alpha += 0.005f;
  if ( alpha > 0.98f )
   alpha = 1.0f;
  glBegin( GL_QUADS );
  glColor4f( 1.0f, 1.0f, 1.0f , alpha);
  glTexCoord2f( 0.0f, 0.0f);
  glVertex2f(  0.00f, 0.0f);
  glTexCoord2f( 1.00f, 0.00f);
  glVertex2f( 0.2f, 0.0f);
  glTexCoord2f( 1.00f, 1.00f);
  glVertex2f( 0.2f, 0.1f);
  glTexCoord2f( 0.00f, 1.00f);
  glVertex2f( 0.0f, 0.1f);
  glEnd( );
}
// 恢复原绘制状态
if( !texstate ) {
  glDisable( GL_TEXTURE_2D );
}
pfPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projmat);
glMatrixMode( matmode );
glEnable(GL_DEPTH_TEST);
pfEnable(PFEN_LIGHTING);
pfTransparency( trans );
glEnable( cullface );
pfPopState ();
}

  这里面有个读入LOGO图像问题,可以自己写程序读入,也可以使用专门的图像API接口来帮你完成读入工作,很灵活,这需要大家自己实现了:)

  提供给大家一个取巧的办法:

  直接用pfLoadTexFile(pftex, "logo.rgba") 来用一个已经被Vega加载的纹理来当作LOGO图片,前提条件是该纹理一定要在FLT中使用过,这样一来就不用麻烦的:
 
char* buffer;
  int imgSize;
  pftex = pfNewTex( vgGetSharedArena() );
  imgSize = logo_width * logo_height * logo_com * sizeof(char);
  buffer = (char*) pfMalloc(imgSize ,vgGetSharedArena());
  memcpy(buffer,logo_image_data,imgSize);  
  pfTexImage( pftex, (unsigned int *)(buffer), logo_com, logo_width, logo_width,1 );


  直接用一句话搞定!
  特别提醒大家注意:pfLoadTexFile或者vgLoadTexFile只能读入已经被Vega加载的纹理,也就是加载的FLT模型中使用的纹理,不要试图用它从硬盘上直接读取其他纹理文件。

(完)
可打印版本 | 文章评论 | 我来纠错

|网友评论

    笔名:

    内容:

        

    |热点关注

    新歌 白狐 左边 拉拉爱 校园网 自由飞翔 感恩的心 边做边爱 为你写诗 北京欢迎你 范跑跑之歌 遇上你是我的缘 坏女人 N81 星星 火花 放生 不值得 手机网 分手那天 忘不掉的伤 电子杂志 网上展会 天使 城府 爱死了昨天 BT电影下载 N70 最后一次的温柔 小小 承诺 有没有人告诉你 N73 光荣 葬爱 大海 日不落 有缘人 躲避的爱 香水有毒 一定要爱你 求佛 爱在离别时 北极星的眼泪 假如 flash 歌曲 启示录 那滋味 独家记忆 放手去爱 丁香花 会呼吸的痛 音乐排行榜 爱上别人的人 对不起我爱你 N70 6300 会有天使替我爱你 DJ 爱上你是我的错 不要在我寂寞的时候说爱我 爱上你是一个错 爱你爱的好疲惫 怎么会狠心伤害我 MP3 音乐手机 拍照手机 智能手机 CDMA手机 怒放的生命 老人与海 等爱的玫瑰 爱情里没有谁对谁错 做你的爱人 感动天感动地 做我老婆好不好 你的承诺 王子 心碎 舍不得 摇啊摇 泪的告白 寂寞才说爱 擦肩而过 阿里阿里 中国基金网 新不了情 小情歌 离歌

    关于我们 - 版权隐私 - 友情链接 - 广告服务 - 项目合作 - 网站地图 - 联系方式

    ©Copyright by 86CG.COM, 2006-2008. All rights reserved 京ICP备06059503号