MFC + OpenGL 程序, 欲读取位图创建纹理.最初用的MDI, 用glGenTextures获取可用的纹理对象名称失败. 在网上搜到说要加上wglMakeCurrent或用单文档. 我的hDC和hGLRC初始化后就一直没释放啊, 并且加上wglMakeCurrent也不行. (我把opengl做成了一个类, hDC与hGLRC是它的属性, 然后在视图中定了一个opengl类的对象.)然后我就改成SDI. 这下好了, glGenTextures能返回正确的纹理对象名称了. 但新的问题来了: 运行时在glTexImage2D处出现了错误: Unhandled exception at 0x690d139d in Load3ds.exe: 0xC0000005: Access violateion reading location 0x11767000.麻烦各位帮帮忙. 
我用的是vc2005.

解决方案 »

  1.   

    下面是源代码:
    --------------------------------------------------------------
    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);
      

  2.   

    你的代码部分是没有问题的,我觉得也可能是你的设置错误,一般能用单文档做的最好不要用多文档做,MFC本身的体系结构决定了用多文档很容易出现你想不到的结果,原因也很难得找出,而且一般的问题基本都可以用单文档解决的建议你用单文档改到试下看怎么样。
      

  3.   

    改成单文档后, 分配纹理对象名称成功了; 但用glTexImage2D指定纹理时出错.现在已经解决了, 出错的原因是我使用的BMP文件宽高不是2的整数次幂.