OpenGL中创建贴图的问题

KyosukeNo1 2003-06-24 01:09:32
我做了一个类用来存放和管理贴图,但现在无论读入多少新的贴图,不知为什么显示的时候只能显最后读入的那张?下面是类里的函数
#include "Texture.h"

CTexture::CTexture(){
}

CTexture::~CTexture(){
}

AUX_RGBImageRec *CTexture::LoadBMP( char *pFilename ){
FILE *pFile=NULL;

if ( !pFilename ) {
return NULL;
}

pFile = fopen( pFilename, "r" );

if ( pFile ) {
fclose( pFile );
return auxDIBImageLoad( pFilename );
}

return NULL;
}

boolean CTexture::Loader( char *cPicPath, GLuint nTexNum ){
if( nTexNum > MAX_TEXTURE ) {
return false;
}
boolean Status = false;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1);

if ( TextureImage[0] = LoadBMP( cPicPath ) ) {
Status = true;

glGenTextures(1, &nTextures[nTexNum] );
glBindTexture(GL_TEXTURE_2D, nTextures[nTexNum] );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
}

if (TextureImage[0]) {
if (TextureImage[0]->data) {
free(TextureImage[0]->data);
}
free(TextureImage[0]);
}
return Status;
}

void CTexture::SetTexture( GLuint nTexNum )
{
if( nTexNum > MAX_TEXTURE ) {
return;
}
glBindTexture( GL_TEXTURE_2D, nTextures[nTexNum] );
}
...全文
61 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fastbit 2003-06-25
  • 打赏
  • 举报
回复
来晚了:)
maplexp 2003-06-24
  • 打赏
  • 举报
回复
唉,glBindTexture不能放到glBegin/glEnd之间,把defaultTexture->SetTexture( 0 );改到glBegin前面就对了
KyosukeNo1 2003-06-24
  • 打赏
  • 举报
回复
已经发出了,大家帮忙看看:)
fastbit 2003-06-24
  • 打赏
  • 举报
回复
方便的话也发给我一份fastbit@163.com
maplexp 2003-06-24
  • 打赏
  • 举报
回复
方便的话把完整的程序发给我看看呢 maplexp@163.com
meidoudou2002 2003-06-24
  • 打赏
  • 举报
回复
裕作有qq 么?我的qq:16015167,加我好么?可以请教一些问题
meidoudou2002 2003-06-24
  • 打赏
  • 举报
回复
我以前也碰到过,赋了初值就好了,不知道为什么
KyosukeNo1 2003-06-24
  • 打赏
  • 举报
回复
显卡是9500,不过贴图的装载和显卡无关吧?
两个贴图都是Photoshop刚改过,24bit色,好像没问题。。。另外glGenTextures和glBindTexture是没有返回值的,其他的没有嫌疑吧?哭……
fastbit 2003-06-24
  • 打赏
  • 举报
回复
还有可能是装载位图出的错,1.bmp和grass.bmp格式是不是不一样,最好检查一下各个函数的返回值
fastbit 2003-06-24
  • 打赏
  • 举报
回复
你的显示卡是什么?更新显卡驱动程序试试?
KyosukeNo1 2003-06-24
  • 打赏
  • 举报
回复
调试时看到,nTextures[0]和nTextures[1]确实已经在glGenTextures里赋了不同的值,所以和这个无关的吧

另外,我最初的构思就是和楼上写的那样只管理一个贴图,也遇到这个问题,才试着改成现在这样子的……而且管理一个贴图和管理多个贴图在这个步骤上没有什么不同吧……郁闷ing
maplexp 2003-06-24
  • 打赏
  • 举报
回复
和初始化nTextures[nTexNum]没关系的说,nTextures[nTexNum]在这句赋了不同的值的;
glGenTextures(1, &nTextures[nTexNum] );

建议CTexture只管理一个纹理,对每个纹理都创建一个CTexture对象,那么读取、绑定纹理可以像这样
tex1.LoadGLTexture( texFile1 );
tex2.LoadGLTexture( texFile2 );
……
tex1.SetTexture();
……
tex2.SetTexture();
meidoudou2002 2003-06-24
  • 打赏
  • 举报
回复
nTextures[nTexNum]这个数组,用之前先初始化比如nTextures[2],分别赋值1,2,否则都是0,这样两张贴图的代号都是0,调用 defaultTexture->SetTexture( 0 );相当于先调用1.bmp,然后是grass.bmp,所以grass.bmp覆盖了1.bmp
KyosukeNo1 2003-06-24
  • 打赏
  • 举报
回复
使用Loader的代码
defaultTexture = new CTexture;
defaultTexture->LoadGLTextures( "Texture/1.bmp", 0 );
defaultTexture->LoadGLTextures( "Texture/grass.bmp", 1 );

使用SetTexture的代码:
int DrawGLScene(GLvoid) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -5.0f );

glBegin(GL_QUADS);
glColor3f( 1.0f, 1.0f, 1.0f );
defaultTexture->SetTexture( 0 );

glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f( 0.0f, 1.0f );
glVertex3f( -1.0f, 1.0f, -10.0f );
glTexCoord2f( 1.0f, 1.0f );
glVertex3f( 1.0f, 1.0f, -10.0f );
glTexCoord2f( 1.0f, 0.0f );
glVertex3f( 1.0f, -1.0f, -10.0f );
glTexCoord2f( 0.0f, 0.0f );
glVertex3f( -1.0f, -1.0f, -10.0f );
glEnd();
return TRUE;
}
这种情况下显示的是grass.bmp的内容,但我调用的是1.bmp啊……
fastbit 2003-06-24
  • 打赏
  • 举报
回复
这几行代码我看不出有错误的地方:(
maplexp 2003-06-24
  • 打赏
  • 举报
回复
把使用Loader和SetTexture的代码贴出来呢

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧