C++ OpenGL很顽固,不允许纹理映射

C++ OpenGL很顽固,不允许纹理映射,c++,opengl,C++,Opengl,我正在开发一个游戏引擎,它在MD3模型文件上使用BMP纹理文件。不幸的是,它根本不起作用。我什么都试过了,没用。由于我自己编写了加载程序,我查看了它们,并修复了其中的一些错误,但我还是得到了一个灰色的模型 以下是我的渲染代码: void drawmd3(md3& model, GLuint tex) { int i = 0; glLoadIdentity(); glTranslatef(-1.5,0,-24); glRotatef(270,0,0,1);

我正在开发一个游戏引擎,它在MD3模型文件上使用BMP纹理文件。不幸的是,它根本不起作用。我什么都试过了,没用。由于我自己编写了加载程序,我查看了它们,并修复了其中的一些错误,但我还是得到了一个灰色的模型

以下是我的渲染代码:

void drawmd3(md3& model, GLuint tex)
{
    int i = 0;
    glLoadIdentity();
    glTranslatef(-1.5,0,-24);
    glRotatef(270,0,0,1);
    glRotatef(-90,0,1,0);
    glRotatef(a,0,0,1);
    while(i<model.surfnum)
    {
        glBindTexture(GL_TEXTURE_2D, tex);
        int j = 0;
        while(j<model.surfs.at(i).trinum)
        {
                int tmp = model.surfs.at(i).tris.at(j).indexes[0];
                int tmp1 = model.surfs.at(i).tris.at(j).indexes[1];
                int tmp2 = model.surfs.at(i).tris.at(j).indexes[2];

            float norms[3];
            norms[0] = convert_normals0(model.surfs.at(i).verts.at(tmp).normal);
            norms[1] = convert_normals1(model.surfs.at(i).verts.at(tmp).normal);
            norms[2] = convert_normals2(model.surfs.at(i).verts.at(tmp).normal);
            float norms1[3];
            norms1[0] = convert_normals0(model.surfs.at(i).verts.at(tmp1).normal);
            norms1[1] = convert_normals1(model.surfs.at(i).verts.at(tmp1).normal);
            norms1[2] = convert_normals2(model.surfs.at(i).verts.at(tmp1).normal);
            float norms2[3];
            norms2[0] = convert_normals0(model.surfs.at(i).verts.at(tmp2).normal);
            norms2[1] = convert_normals1(model.surfs.at(i).verts.at(tmp2).normal);
            norms2[2] = convert_normals2(model.surfs.at(i).verts.at(tmp2).normal);

            glBegin(GL_TRIANGLES);

            glNormal3f(norms[0],norms[1],norms[2]);
            glTexCoord2f(model.surfs.at(i).st.at(tmp).st[0],1-model.surfs.at(i).st.at(tmp).st[1]);
            glVertex3f(model.surfs.at(i).verts.at(tmp).coord[0]/64, model.surfs.at(i).verts.at(tmp).coord[1]/64, model.surfs.at(i).verts.at(tmp).coord[2]/64);
            glNormal3f(norms1[0],norms1[1],norms1[2]);
            glTexCoord2f(model.surfs.at(i).st.at(tmp1).st[0],1-model.surfs.at(i).st.at(tmp1).st[1]);
            glVertex3f(model.surfs.at(i).verts.at(tmp1).coord[0]/64, model.surfs.at(i).verts.at(tmp1).coord[1]/64, model.surfs.at(i).verts.at(tmp1).coord[2]/64);
            glNormal3f(norms2[0],norms2[1],norms2[2]);
            glTexCoord2f(model.surfs.at(i).st.at(tmp2).st[0],1-model.surfs.at(i).st.at(tmp2).st[1]);
            glVertex3f(model.surfs.at(i).verts.at(tmp2).coord[0]/64, model.surfs.at(i).verts.at(tmp2).coord[1]/64, model.surfs.at(i).verts.at(tmp2).coord[2]/64);

            glEnd();
            j++;
        }
        glBindTexture(GL_TEXTURE_2D, 0);
        i++;
    }
}

这就是你的问题所在:

glTexImage2D(GL_TEXTURE_2D, 
             0, 
             GL_RGBA8, 
             img.img.imgwidth, 
             img.img.imgheight, 
             0, 
             GL_RGBA8,    <<<<<<<<<<----------
             GL_UNSIGNED_BYTE, 
             img.data);
glTexImage2D(GL_纹理_2D,
0, 
德国劳埃德大学,
img.img.imgwidth,
img.img.imgheight,
0, 

GL_RGBA8,如果你在绑定之前再做一次glEnable,会有什么不同吗?+1只是为了标题-当然软件不会很顽固,但是当OpenGL不能做你想做的事情时,它总是有一百万种可能!我喜欢
glBegin()
每个三角形。这完全不会成为性能瓶颈。顺便说一句,如果你真的需要使用
glBegin/glEnd
,那么一定不要在这种性能关键的代码中使用
std::vector::at
,因为范围检查根本不值得。但也许你正在使用的是其他类。当然,genpfault是正确的关于愚蠢的每三角形
glBegin/glEnd
,但考虑到那些
convert
函数和
glBegin/glEnd
,我想这不是这里唯一的性能问题。如果你绑定一个小的纯色纹理,你看到那个颜色了吗?仍然不起作用。我用GL\u RGBA作为那个参数。编辑:好,有点现在可以工作了,但是图像在屏幕上闪烁了一秒钟,然后消失了,所以我真的说不出来。它工作不正常,结果是对于某些纹理,它有作用,但对其他纹理没有作用。我现在让所有的东西都是RGB。@DariusLoad:它只对某些纹理有效?那些纹理是2倍大小的吗,例如128x64或512x512?你能告诉我们,你有哪个OpenGL版本吗?
glGetString(GL_版本);
。它们是2的幂(测试的纹理是512*512),我有一台非常旧的计算机,所以我有一台非常旧的OpenGL:2.1.2OK,它终于工作了,但纹理有点搞砸了。
glTexImage2D(GL_TEXTURE_2D, 
             0, 
             GL_RGBA8, 
             img.img.imgwidth, 
             img.img.imgheight, 
             0, 
             GL_RGBA8,    <<<<<<<<<<----------
             GL_UNSIGNED_BYTE, 
             img.data);