C++ 类中的OpenGL函数

C++ 类中的OpenGL函数,c++,opengl,glfw,glm-math,C++,Opengl,Glfw,Glm Math,我正在创建一个OpenGL项目,其中包括ParticleFactory类,用于在场景中生成粒子 为此,我创建了一个类: #ifndef PARTICLE_H #define PARTICLE_H #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/

我正在创建一个OpenGL项目,其中包括
ParticleFactory
类,用于在场景中生成粒子

为此,我创建了一个类:

#ifndef PARTICLE_H
#define PARTICLE_H

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <iostream> 
#include <vector>
#include "vertex.h"

#include <shader_s.h>

class ParticleFactory {
    public:
        Shader* shader;
        std::vector<Particle> particles;
        unsigned int VAO, VBO, EBO;
        unsigned int nr_particles;

        ParticleFactory(unsigned int nr_particles, unsigned int color){
            Shader sh("shaders/particle.vs", "shaders/particle.fs");
            shader = &sh;
            this->nr_particles = nr_particles;
            for(unsigned int i = 0; i < nr_particles; i++) {
                float x = (rand()%200)/100.0 - 1;
                float y = (rand()%200)/100.0 - 1;
                float z = (rand()%200)/100.0 - 1;
                particles.push_back(Particle(glm::vec4(x, y, z, 0.0)));
            }

            glGenVertexArrays(1, &VAO);
            glGenBuffers(1, &VBO);
            glGenBuffers(1, &EBO);
            glBindVertexArray(VAO);
            glBindBuffer(GL_ARRAY_BUFFER, VBO);
            glBufferData(GL_ARRAY_BUFFER, sizeof(base_particle), base_particle, GL_STREAM_DRAW);
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(base_particle_indices), base_particle_indices, GL_STREAM_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
            glEnableVertexAttribArray(0);
        }

        void draw() {
            shader->use();
            shader->setMat4("model", model);
            shader->setMat4("view", view);
            shader->setMat4("projection", projection);
            shader->setMat4("transform", transform);
            for (int i=0; i<nr_particles; i++) {
                shader->setVec4("offset", particles[i].offset);
                glBindVertexArray(VAO);
                glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
                particles[i].offset += glm::vec4(0.0f, -0.001f, 0.0f, 0.0f);
                if (particles[i].offset.y <= -1.0f) {
                    particles[i].offset.y = 1.0f;
                }
            }
        }
};

#endif
\ifndef PARTICLE\u H
#定义粒子
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“vertex.h”
#包括
类粒子工厂{
公众:
着色器*着色器;
向量粒子;
未签名的int VAO、VBO、EBO;
无符号整数nr_粒子;
ParticleFactory(无符号整数nr_粒子,无符号整数颜色){
着色器sh(“着色器/particle.vs”、“着色器/particle.fs”);
着色器=&sh;
这->nr_粒子=nr_粒子;
for(无符号整数i=0;i使用();
着色器->setMat4(“模型”,模型);
着色器->setMat4(“视图”,视图);
着色器->setMat4(“投影”,投影);
着色器->setMat4(“变换”,变换);
对于(int i=0;isetVec4(“偏移量”),粒子[i].offset);
glBindVertexArray(VAO);
gld元素(GL_三角形,24,GL_无符号,0);
粒子[i].偏移量+=glm::vec4(0.0f,-0.001f,0.0f,0.0f);

如果(particles[i].offset.y在我们进入OpenGL部分之前,您正在创建一个LOCAL对象(sh),然后将该对象的地址分配给着色器成员。在构造函数末尾,sh将被删除,因此着色器成员将指向…?首先,您需要使用new/delete(或者更好的方法是,使用std::unique_ptr)确保对象在您想要使用它时仍然存在

首先尝试在a中进行编辑。!

据我们所知,您可以在没有当前GL上下文的情况下创建
ParticleFactory
实例,或者在缺少CTOR/dtor的情况下随意复制它们。