1

我正在开发一个基本上只是 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 函数的作用。

4

0 回答 0