openGL贴图显示纹理的标准流程是什么?

WYHVC 2010-04-06 09:30:40
我有个贴图显示纹理图像的openglGL程序,在一台式机(HP Compaq dc7600,xp系统)上运行显示没有问题,考到一台联想(7663MS3,windows7系统)上怎么就一点不显示呢?应该不是硬件的问题,因为我从别人那里考的一个opengl的exe能够显示纹理。
我猜想是不是我的程序不规范?
我写一下我的程序流程,请高手帮我查一查:
1.OnCreate()中:
if(hglrc==NULL)
{
PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,//32位颜色深度
0,0,0,0,0,0,
1,//alpha
0,
0,//
0,0,0,0,
32,//32位z缓存
0,
0,
PFD_MAIN_PLANE,
0,0,0,0
};

CClientDC clientdc(this);
this->GetClientRect(&m_ClientRect);//窗口大小
int cpf=ChoosePixelFormat(clientdc.m_hDC,&pfd);
SetPixelFormat(clientdc.m_hDC,cpf,&pfd);
hglrc=wglCreateContext(clientdc.m_hDC);
}

2.OnSize()中:
GLsizei w=m_ClientRect.Width();
GLsizei h=m_ClientRect.Height();
if(!h)
return;
CClientDC clientDC(this);
wglMakeCurrent(clientDC.m_hDC,hglrc);
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,1.0f,50.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

3.init()函数:

glGenTextures(1,&intexture[0]);
glBindTexture(GL_TEXTURE_2D,intexture[0]);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, g_imgbmpWidth2,g_imgbmpHeight2,GL_RGBA,GL_UNSIGNED_BYTE,symbol);

glGenTextures(1,&intexture[1]);
glBindTexture(GL_TEXTURE_2D,intexture[1]);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, g_terbmpWidth1,g_terbmpHeight1,GL_RGBA,GL_UNSIGNED_BYTE,m_symbol);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE,GL_DECAL);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);//
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//

4.OnDraw()函数中:
glClearColor(float(m_Bred)/255.0f,float(m_Bgreen)/255.0f,float(m_Bblue)/255.0f,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE,GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,intexture[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glEnable(GL_LINE_SMOOTH);//反走样
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//alpha模式下反走样
//glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);//20100322无效果

glShadeModel(GL_SMOOTH);
glPushMatrix();
glTranslatef(m_fMoveX,m_fMoveY,-3.5);
glRotatef(m_fAngleX,1.0,0.0,0.0);
glRotatef(m_fAngleY,0.0,1.0,0.0);
glRotatef(m_fAngleZ,0.0,0.0,1.0);
glScalef(m_fGlobalScale,m_fGlobalScale,m_fGlobalScale);//缩放

if(g_imgbmpWidth2>0 && g_imgbmpHeight2>0)
drawPic();//画纹理1

if(g_terbmpWidth1>0 && g_terbmpHeight1>0)
{
glBindTexture(GL_TEXTURE_2D,intexture[1]);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,g_terbmpWidth1,g_terbmpHeight1,GL_RGBA,GL_UNSIGNED_BYTE,m_symbol);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat light_position[]={0.0f,6.0f,5.5f,0.0f};
GLfloat light_ambient[]={1.0f,1.0f,1.0f,0.0f};
GLfloat mat_env[]={0.75f,0.75f,0.75f,0.0f};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_env);
draw(); //画纹理2
glDisable(GL_LIGHTING);
}
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glPopMatrix();
glFlush();
SwapBuffers(pdc->m_hDC);


一共4个地方,我按顺序写的,请帮我看看哪里有问题,恳请帮我指出来,谢谢!
...全文
465 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYHVC 2010-04-08
  • 打赏
  • 举报
回复
我来结帖了
谢谢各位,尤其感谢zhangci226
我说一下我的改动:
1. OnCreate中
if(hglrc==NULL)
{
PIXELFORMATDESCRIPTOR pfd={
....
};

m_pDC = new CClientDC(this);//这里原来是一个局部变量CClientDC clientdc(this);现改为类的成员变量CClientDC *m_pDC;
int cpf=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);//所有m_pDC->GetSafeHdc()原来都是clientDC.m_hDC
SetPixelFormat(m_pDC->GetSafeHdc(),cpf,&pfd);
hglrc=wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(),hglrc);//这里原来放在OnSize中的
}
2.第二个改动的地方就是OnDraw中画完图SwapBuffers(wglGetCurrentDC());原来是SwapBuffers(pdc->m_hDC);

虽然画出来了,可是我还是不懂为什么。


WYHVC 2010-04-07
  • 打赏
  • 举报
回复
zhangci226,请给我你的邮箱好吗?
WYHVC 2010-04-07
  • 打赏
  • 举报
回复
zhangci226,你邮箱是多少?我找不到
WYHVC 2010-04-07
  • 打赏
  • 举报
回复
是n卡
不过我这里有一个别人的exe,功能跟我的程序差不多,人家的程序就能演示
gamemagic 2010-04-07
  • 打赏
  • 举报
回复
你的显卡是A卡还是N卡?建议更新到最新显卡驱动
张赐 2010-04-07
  • 打赏
  • 举报
回复
楼主,你把程序发到我邮箱
我在我电脑上试下,我的是win7的
WYHVC 2010-04-07
  • 打赏
  • 举报
回复
我把贴图什么的全注掉了,就画了三条直线,xp机器上画出来三条线,windows7机器上连线都没画,我现在基本断定是机器设置或者驱动的问题。

就是不知道这样的话我需要从哪里设置一下?有没有办法?
WYHVC 2010-04-07
  • 打赏
  • 举报
回复
颜色缓冲改24深度缓冲16跟原来一样,我改了几组数试过也不行

在我的xp机器上运行时没有问题的,

而且别人的win7系统也装过我的程序也能显示,只是配置不同,真郁闷

再帮我看看我的程序行吗?程序到底有没有错?opengl的rc有值,等于0x00010000,两台机器上都是这个值,就是下边unused不同,一个正数,一个负数
gamemagic 2010-04-07
  • 打赏
  • 举报
回复
WINDOWS7 的opengl驱动有问题,楼主试试换个驱动。你的程序在XP上运行有没问题?
张赐 2010-04-07
  • 打赏
  • 举报
回复
颜色缓冲可以不改,一般都支持24位的
深度缓冲使用16位试试
WYHVC 2010-04-07
  • 打赏
  • 举报
回复
请问这怎么解决?我怎么知道显示不正常的机器应该设z缓存多大?我随意把颜色缓存、深度缓存改成16,24,32等试了试结果还是一样,有没有什么办法?
张赐 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wyhvc 的回复:]
zhangci226,请给我你的邮箱好吗?
[/Quote]

zhangci226@hotmail.com
思月行云 2010-04-07
  • 打赏
  • 举报
回复
帮顶一下~~
张赐 2010-04-06
  • 打赏
  • 举报
回复
glGenTextures();只用一次

glGenTextures(2,intexture);

glBindTexture(GL_TEXTURE_2D, &intexture[0]);
glTexImage2D(...);

glBindTexture(GL_TEXTURE_2D, &intexture[1]);
glTexImage2D(...);
WYHVC 2010-04-06
  • 打赏
  • 举报
回复
我在onInit()中
这样写:
glGenTextures(2,&intexture[0]);
//glBindTexture(GL_TEXTURE_2D,intexture[0]);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, g_imgbmpWidth2,g_imgbmpHeight2,GL_RGBA,GL_UNSIGNED_BYTE,symbol);

glGenTextures(2,&intexture[1]);
//glBindTexture(GL_TEXTURE_2D,intexture[1]);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, g_terbmpWidth1,g_terbmpHeight1,GL_RGBA,GL_UNSIGNED_BYTE,m_symbol);

在OnDraw()中分别glBindTexture(GL_TEXTURE_2D,intexture[0]);
..
drawPic();//纹理1
...
glBindTexture(GL_TEXTURE_2D,intexture[1]);
...
draw();//纹理2
..
这样什么都不显示阿
张赐 2010-04-06
  • 打赏
  • 举报
回复
glGenTextures(2,intexture);

这样写,然后后面使用纹理的时候再glBindTexture
WYHVC 2010-04-06
  • 打赏
  • 举报
回复
在myinit()中
glGenTextures(1,&intexture[0]);
glBindTexture(GL_TEXTURE_2D,intexture[0]);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, g_imgbmpWidth2,g_imgbmpHeight2,GL_RGBA,GL_UNSIGNED_BYTE,symbol);
这三个函数调用是不是必须这样的?我注掉就什么也不显示了。
还有就是您后边说的,我同时显示两个纹理,在初始化的时候应该怎样用glGenTextures()?


张赐 2010-04-06
  • 打赏
  • 举报
回复
你的glGenTextures(1,&intexture[0]);
怎么用了2次?

想用多个纹理,用一个就可以了
第一个参数表示纹理个数,第二个参数表示指向标识纹理的index的首地址
WYHVC 2010-04-06
  • 打赏
  • 举报
回复
drawPic()内容:
glBegin(GL_QUADS);
glTexCoord2f(leftbmp,nearbmp); //贴图坐标
glVertex3f(vertexLeft,g_bmpPicY,vertexNear);//显示坐标
glTexCoord2f(leftbmp,farbmp);
glVertex3f(vertexLeft,g_bmpPicY,vertexFar);
glTexCoord2f(rightbmp,farbmp);
glVertex3f(vertexRight,g_bmpPicY,vertexFar);
glTexCoord2f(rightbmp,nearbmp);
glVertex3f(vertexRight,g_bmpPicY,vertexNear);
glEnd();

纹理1不用光照,就是贴一个图片,纹理2有x,y,z坐标,用了光照,
我觉得drawPic()和draw()应该没有问题,就是一些坐标值计算嘛,是不是myinit()或OnDraw()函数中的设置有问题?
张赐 2010-04-06
  • 打赏
  • 举报
回复
drawPic();//画纹理1

函数是什么内容
加载更多回复(8)

8,304

社区成员

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

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