我正在开发一个基本上只是 2D 绘画的 OpenGL 项目。您可以从画布中添加/删除“块”并执行其他一些基本操作。我正在尝试实现多个纹理并且很难做到这一点。需要明确的是,我不需要多个着色器,只需要不同的纹理。这是我的 Block 类的样子:
#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, &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, &width, &height, &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 函数的作用。