#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. Скорее всего, в вашем приложении еще одна ошибка.