C++ 类中的OpenGL函数
我正在创建一个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/
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的情况下随意复制它们。