尝试包含纹理SDL2 C ++时出现断言错误

时间:2019-02-23 19:50:16

标签: c++ sdl-2 glew

我用SDL2制作了一个图形引擎,当我添加纹理时,它显示错误:

Screenshot

但是,如果我不包含纹理,则一切正常。

我也有理由相信该错误已连接到IDE,因为我阅读了其他问题。

我的IDE:VS 2017专业版

代码

run()

void maingame::run()
{
    initSystems();
    _sprite.init(-1.0f, -1.0f, 2.0f, 2.0f);
    _enemyTexture = ImageLoader::loadPNG("textures/jimmyJump_pack/PNG/CharacterRight_Standing.png");
    gameLoop();
}

run()方法被main()函数调用

精灵的初始化:

void targetSprite::init(float x, float y, float width, float height)
{
    _x = x;
    _y = y;
    _width = width;
    _height = height;

    if (_vboID == 0) {
        glGenBuffers(1, &_vboID);
    }
    Vertex vertexData[6];
    //1st
    vertexData[0].setPos(_x + _width, _y + _height);
    vertexData[0].setUV(1.0f, 1.0f);

    vertexData[1].setPos(_x, _y + _height);
    vertexData[1].setUV(0.0f, 1.0f);

    vertexData[2].setPos(_x, _y);
    vertexData[2].setUV(0.0f, 0.0f);

    //2nd

    vertexData[3].setPos(_x, _y);
    vertexData[3].setUV(0.0f, 0.0f);

    vertexData[4].setPos(_x + _width, _y);
    vertexData[4].setUV(1.0f, 0.0f);

    vertexData[5].setPos(_x + _width, _y + _height);
    vertexData[5].setUV(1.0f, 1.0f);

    for (int i = 0; i < 6; i++) {
        vertexData[i].setColor(127, 127, 255, 255);
    }

    vertexData[1].setColor(255, 0, 255, 255);
    vertexData[4].setColor(0, 255, 255, 255);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
}

我发布了此信息是因为我相信错误在这里。

但这不是必需的,因为相同的代码可以运行纹理。

在第10行上,“顶点”是一个结构。

我尝试将构建版本从调试更改为发行版,但随后我遇到了.dll文件问题。

编辑:

这将导致向量错误:

GLTexture ImageLoader::loadPNG(std::string filePath)
{
    GLTexture texture = {};
    std::vector<unsigned char> out;
    unsigned long width;
    unsigned long height;
    std::vector<unsigned char> in;
    if (IOManager::readFileToBuffer(filePath, in) == false) { //read the texture to buffer
        fatalError2("FTB 1");
    }
    int errorCode = decodePNG(out, width, height, &(in[0]), in.size()); //error line
    if (errorCode != 0) {
        fatalError2("DPNG 1: " + std::to_string(errorCode));
    }

    glGenTextures(1, &(texture.id));
    glBindTexture(GL_TEXTURE_2D, texture.id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(out[0]));
    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_LINEAR);
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

    texture.width = width;
    texture.height = height;

    return texture;
}

第25行,然后返回run(),main(),然后打开“找不到sdl_windows_main.c”窗口。

所以我想问题是该文件位于何处?

编辑2

readFileToBuffer()方法,我负责填充“ in”向量

bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char> buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}

1 个答案:

答案 0 :(得分:0)

解决方案是通过引用传递“缓冲区”

bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char>&buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}
´´´