0

I had this problem when compiling my OpenGL code on lower-end PC's that don't support OpenGL 4.5 and macs. In my regular code, I would use functions like glCreateTextures and glTextureStorage2D, but they are not supported in other versions so I went the other glGenTextures path.

Here's the image generation code:

Texture::Texture(const std::string& path)
        : m_Path(path)
    {
        int width, height, channels;
        stbi_set_flip_vertically_on_load(1);
        unsigned char* data = stbi_load(path.c_str(), &width, &height, &channels, 0);

        RW_CORE_ASSERT(data, "Failed to load image!");
        m_Width = width;
        m_Height = height;

        GLenum internalFormat = 0, dataFormat = 0;
        if (channels == 4)
        {
            internalFormat = GL_RGBA8;
            dataFormat = GL_RGBA;
        }
        else if (channels == 3)
        {
            internalFormat = GL_RGB8;
            dataFormat = GL_RGB;
        }

        m_InternalFormat = internalFormat;
        m_DataFormat = dataFormat;

        RW_CORE_ASSERT(internalFormat & dataFormat, "Format not supported!");

        glGenTextures(1, &m_ID);

        glBindTexture(GL_TEXTURE_2D, m_ID);


        glTexParameteri(m_ID, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(m_ID, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

        glTexParameteri(m_ID, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(m_ID, GL_TEXTURE_WRAP_T, GL_REPEAT);

        glTexImage2D(m_ID, 1, internalFormat, m_Width, m_Height, 0, dataFormat, GL_UNSIGNED_BYTE, data);

        glBindTexture(GL_TEXTURE_2D, 0);

        stbi_image_free(data);
    }

And I want to bind my textures to specific slots on the GPU so I have this function:

void Texture::Bind(uint32_t slot) const
    {

        glActiveTexture(GL_TEXTURE0 + slot);
        glBindTexture(GL_TEXTURE_2D, m_ID); 
    }

Here's the screenshot of what gets drawn: enter image description here

To make sure it wasn't a rendering problem I decided to put it into ImGui's renderer. enter image description here

And here's the picture I am supposed to get:

enter image description here

And image imports correctly, I get no errors and same importing code and paths work on higher-end PC and the only thing that's changed is that the higher-end PC has OpenGL 4.5 texture generation code.

1 Answers1

0

It turns out I had to specify GL_TEXTURE_2D in these places instead of texture ID:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexImage2D(GL_TEXTURE_2D, 1, internalFormat, m_Width, m_Height, 0, dataFormat, GL_UNSIGNED_BYTE, data);