Использование нескольких текстур в OpenGL (GLFW / GLAD)

#c #opengl #glsl #glfw #glad

#c #opengl #glsl #glfw #рад

Вопрос:

Я работаю над проектом OpenGL, который в основном представляет собой просто 2D-рисунок прямо сейчас. Вы можете добавлять / удалять «блоки» с холста и выполнять некоторые другие базовые действия. Я пытаюсь реализовать несколько текстур, и мне это дается с трудом. Чтобы было понятно, мне не нужно несколько шейдеров, просто разные текстуры. Вот как выглядит мой класс блоков:

 #pragma once

#include "shader_s.h"


class Texture {
    Shader* shader;
    unsigned char *data;
    int width, height, nrChannels;

    //Shader shader;


public:
    Texture(char* image) {
        shader = new Shader("shader.vs", "shader.fs");



        unsigned int texture1;

        glGenTextures(1, amp;texture1);
        glBindTexture(GL_TEXTURE_2D, texture1);

        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_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        
        stbi_set_flip_vertically_on_load(true);
        data = stbi_load(image, amp;width, amp;height, amp;nrChannels, 0);
        if (data)
        {
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
            glGenerateMipmap(GL_TEXTURE_2D);
        }
        else
        {
            std::cout << "Failed to load texture" << std::endl;
        }
        stbi_image_free(data);




        shader->setInt("texture1", 0);


    }


public:
    Shader getShader() {
        return *shader;
    }

public:
    void use() {
        shader->use();
        
    }
};
  

и отсюда берется заголовок shader_s (learnopengl).

В принципе, основная проблема заключается в том, что код в конструкторе, касающийся материала OpenGL, переопределяется следующей текстурой (я думаю, что в этом проблема). В результате все классы текстур, отличные от последнего созданного, игнорируются. Я понятия не имею, как это исправить, потому что я не уверен на 100%, что делают все функции OpenGL.

Комментарии:

1. «материал OpenGL переопределяется следующей текстурой» — нет. Вы должны создать несколько текстурных объектов ( texture1 , texture2 , …) перед циклом рендеринга. Привяжите соответствующий текстурный объект, прежде чем рисовать геометрию в цикле рендеринга (например, glBindTexture(GL_TEXTURE_2D, texture1); ).

2. Хорошо, попробовал это, и, кажется, это работает. Спасибо. Редактировать: меня смущает одна вещь. Почему это не работает, если они оба используют одну и ту же переменную. Они обе объявлены в отдельных областях класса, поэтому их следует рассматривать как две разные переменные. Зачем c нужны два класса с индивидуальными именами?

3. Скорее всего, в вашем приложении еще одна ошибка.