用程序显示自己的LOGO
类型:整理 | 来自:86CG | 时间:2007-11-29 |
点击:
我们在制作自己的Vega Demo的时候,如何能像Multigen官方那样在屏幕上显示一个自己的LOGO呢?可以使用下面这段VGCHAN_POSTDRAW回调程序:
这里面有个读入LOGO图像问题,可以自己写程序读入,也可以使用专门的图像API接口来帮你完成读入工作,很灵活,这需要大家自己实现了:)
提供给大家一个取巧的办法:
直接用pfLoadTexFile(pftex, "logo.rgba") 来用一个已经被Vega加载的纹理来当作LOGO图片,前提条件是该纹理一定要在FLT中使用过,这样一来就不用麻烦的:
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 ();
}
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 );
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模型中使用的纹理,不要试图用它从硬盘上直接读取其他纹理文件。
(完)
- 上篇文章: FST格式全攻略
- 返回:Multigen
- 下篇文章:Vega Vs OpenGL
CG橙子精彩导航: 










