游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5150|回复: 5

[求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改成S

[复制链接]

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2007-9-5 08:32:00 | 显示全部楼层 |阅读模式
MFC + OpenGL 程序, 欲读取位图创建纹理.

最初用的MDI, 用glGenTextures获取可用的纹理对象名称失败. 在网上搜到说要加上wglMakeCurrent或用单文档. 我的hDC和hGLRC初始化后就一直没释放啊, 并且加上wglMakeCurrent也不行. (我把opengl做成了一个类, hDC与hGLRC是它的属性, wglMakeCurrent后就一直没有释放, 然后在视图中定了一个opengl类的对象.)

然后我就改成SDI. 这下好了, glGenTextures能返回正确的纹理对象名称了. 但新的问题来了: 运行时在glTexImage2D处出现了错误: Unhandled exception at 0x690d139d in Load3ds.exe: 0xC0000005: Access violateion reading location 0x11767000.

麻烦各位帮帮忙.
我用的是vc2005.

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
 楼主| 发表于 2007-9-5 08:33:00 | 显示全部楼层

代码

下面是源代码:
--------------------------------------------------------------
glGenTextures(nTexCount, &TexName); //TexName里存放纹理对象的名字, [mdi时分配失败]

int i = 0;
BYTE* texImage = 0; //纹理数据数组

//read pic and create tex
loadPic* lp = new loadPic(); //loadPic是一个用于读取位图的对象
long width, height; //width, height分别存放为图宽高
lp->getPicSize((*it_tex)->sFileName, &width, &height); //获取位图尺寸

delete []texImage;
texImage = new BYTE[height*width*3]; //重新分配纹理数组内存

lp->loadBmp24((*it_tex)->sFileName, texImage); //载入位图数据质纹理数组

//bind and set
glBindTexture(GL_TEXTURE_2D, *(pTexNames + i));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
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, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texImage); //制定纹理, [sdi时出错.]

glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

13

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2007-9-5 09:46:00 | 显示全部楼层

Re:[求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改

GL对图像尺寸,格式有要求的,
尺寸一般来说是2和整数次方,格式默认支持BMP,我是新手,说错了别打偶

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
 楼主| 发表于 2007-9-5 10:18:00 | 显示全部楼层

Re:[求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改

先谢了!

我去改成默认格式的试试.

13

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2007-9-5 10:39:00 | 显示全部楼层

Re:[求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改

不用客气,高手都不搭理咱们,自己想办法解决了,这是我用的纹理函数,Animation是一个类,用的时候自己改下



//从文件创建纹理
bool Animation::CreateTexture(char *filename,GLuint &texture)
{
        AUX_RGBImageRec *pImage = NULL;
        //CBitmap oBitmap;
        //oBitmap.LoadBitmap("IDB_BITMAP1");
        pImage = auxDIBImageLoad(filename);
        if(pImage == NULL)                return false;
        glGenTextures(1, &texture);       
        glBindTexture    (GL_TEXTURE_2D,texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D,4, pImage->sizeX,
                                          pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data);
        free(pImage->data);
        free(pImage);       
        return true;
}

//选择纹理
void Animation::SelectTexture(GLuint texture)
{
        glBindTexture  (GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}

//选择纹理重复
void Animation::SelectTextureRepeat(GLuint texture)
{
        glBindTexture  (GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
 楼主| 发表于 2007-9-5 11:40:00 | 显示全部楼层

Re:[求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改

那我就不客气了, 代码参考一下, 呵呵.

把原来的图片改成128*128的不出错了, 但太大了不行, 可能是我内存有部分没处理好.

刚才还从谷歌上搜到你"多个纹理切换问题!"的帖子, 呵呵.

高手们, 呃, 大概都忙吧.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-18 21:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表