C++ 两种纹理的非幂次表示“a”;此应用程序已请求运行时…”;错误

C++ 两种纹理的非幂次表示“a”;此应用程序已请求运行时…”;错误,c++,opengl,graphics,3d,textures,C++,Opengl,Graphics,3d,Textures,我正在使用OpenGL创建一个简单的3D游戏,我真的不明白为什么会出现这个错误。我试图加载一个numberset(一组文件,名为“1.tga”、“2.tga”等)作为分数显示,但是,由于某种原因,如果图像的任何一个维度不是二的幂,那么我会得到错误: “此应用程序请求运行时以异常方式终止它。有关详细信息,请与应用程序的支持团队联系。” 更奇怪的是,它并没有把128、64、32等算作二的幂。我不明白的是,在这个程序中,我已经加载了不是二次幂的纹理(skybox,3072 x 2304),效果很好。但

我正在使用OpenGL创建一个简单的3D游戏,我真的不明白为什么会出现这个错误。我试图加载一个numberset(一组文件,名为“1.tga”、“2.tga”等)作为分数显示,但是,由于某种原因,如果图像的任何一个维度不是二的幂,那么我会得到错误:

“此应用程序请求运行时以异常方式终止它。有关详细信息,请与应用程序的支持团队联系。”

更奇怪的是,它并没有把128、64、32等算作二的幂。我不明白的是,在这个程序中,我已经加载了不是二次幂的纹理(skybox,3072 x 2304),效果很好。但是,出于某种原因,这并不重要

我不确定给出我的代码是否有帮助,但这里是:

void CNumberSet::Load(char *NumberSetDirectory, bool BottomLeftAlign) {
    std::string NSD;
    m_BottomLeftAlign = BottomLeftAlign;
    for (int i = 0; i < 11; i++) {
        // Load texture for each digit
        NSD = NumberSetDirectory;
        if (NSD.at(NSD.length() - 1) == '\\' || NSD.at(NSD.length() - 1) == '/') NSD += (ToString(i) + ".tga");
        else NSD += ("/" + ToString(i) + ".tga");
        m_Textures[i].LoadDataFromFile((char *) NSD.c_str(), CTexture::TARGA);
        m_Textures[i].SetTextureParameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        m_Textures[i].SetTextureParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        // Load and create mesh for each digit, and associate with texture
        float Width = m_Textures[i].GetWidth();
        float Height = m_Textures[i].GetHeight();

        if (BottomLeftAlign) {
            float Vertices[] = {
                0.0f, Height, 0.0f,             0.0f, 1.0f,
                0.0f, 0.0f, 0.0f,               0.0f, 0.0f,
                Width, Height, 0.0f,            1.0f, 1.0f,
                Width, 0.0f, 0.0f,              1.0f, 0.0f
            };
            m_Meshes[i].LoadData(Vertices, sizeof(Vertices), GL_STATIC_DRAW);
        } else {
            float Vertices[] = {
                -Width, Height, 0.0f,           0.0f, 1.0f,
                -Width, 0.0f, 0.0f,             0.0f, 0.0f,
                0.0f, Height, 0.0f,             1.0f, 1.0f,
                0.0f, 0.0f, 0.0f,               1.0f, 0.0f
            };
            m_Meshes[i].LoadData(Vertices, sizeof(Vertices), GL_STATIC_DRAW);
        }

        m_Meshes[i].SetTexture(&m_Textures[i]);
        m_Meshes[i].SetVertexAttribute(m_ShaderProgram, "Vertex", 3, GL_FLOAT, 5 * sizeof(float), (void *)(0 * sizeof(float)));
        m_Meshes[i].SetVertexAttribute(m_ShaderProgram, "TexCoord", 2, GL_FLOAT, 5 * sizeof(float), (void *)(3 * sizeof(float)));
    }
}

在这里,阻碍您的约束很可能不是大小需要是2的幂,而是在默认设置下需要是4的倍数

注意:此答案与类似,但我决定不将此问题指定为重复问题,因为问题场景和产生的症状不同

GL\u UNPACK\u ALIGNMENT
像素存储值控制传递到
glTexImage2D()
的纹理数据的行对齐。默认值为4。这意味着当
glTexImage2D()
读取输入数据时,以字节为单位的行大小将向上舍入到4的下一个倍数

由于使用
GL\u BGR\u EXT
格式指定纹理,因此每个像素有3个字节。因此,如果纹理的宽度也是4的倍数,则以字节为单位的行大小仅为4的倍数

要在不填充传递到
glTexImage2D()
的纹理数据的情况下执行此操作,必须将行对齐值更改为1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

你收到的消息意味着你的应用程序做了一些非常糟糕的事情,比如除以0或访问
null
对象。您能通过调试器运行它以查看哪一行出错吗?从我几天前尝试的结果来看,是glTexImage2D行导致了问题。我尝试了,但不幸的是它没有工作。有没有具体的地方我应该把这条线放在哪里?在我编写纹理之前是否需要对其进行绑定?不,这是一个“全局”(即按上下文)设置。它将应用于所有纹理。调用
glTexImage2D()
之前的任何位置都可以。
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);