C++ 如何在OpenGL中创建合适的粒子系统

C++ 如何在OpenGL中创建合适的粒子系统,c++,opengl,visual-studio-2019,particle-system,C++,Opengl,Visual Studio 2019,Particle System,在我的OpenGL工作中,我做了一些高级图形。我必须展示的总结技巧之一是添加fire CPU粒子系统。需要使用带广告牌的四边形。我确实有一个粒子系统在工作,但出了点问题。它会显示粒子系统,但它不在地形上或不在我的地形上显示(蓝色圆圈)。这也是我的立方体变形的原因(红色圆圈) 代码如下: 我确实觉得这两种情况都有可能 或者从这个 不管怎样,我都会把代码贴在下面 政府政策 #include "ParticleSystem.h" // Dependency Includes

在我的OpenGL工作中,我做了一些高级图形。我必须展示的总结技巧之一是添加fire CPU粒子系统。需要使用带广告牌的四边形。我确实有一个粒子系统在工作,但出了点问题。它会显示粒子系统,但它不在地形上或不在我的地形上显示(蓝色圆圈)。这也是我的立方体变形的原因(红色圆圈)

代码如下:

我确实觉得这两种情况都有可能

或者从这个

不管怎样,我都会把代码贴在下面

政府政策

#include "ParticleSystem.h"
// Dependency Includes
#include <glew.h>
#include <freeglut.h>
#include <SOIL.h>
#include "glm.hpp" 
#include "gtc/matrix_transform.hpp" 
#include "gtc/type_ptr.hpp" 




//Local Includes
#include "Camera.h"
#include "ShaderLoader.h" 
#include "Particle.h"
#include "Utils.h"


//Library Includes
#include <iostream>
#include <vector>

ParticleSystem::ParticleSystem(glm::vec3 origin, Camera* _camera, std::string texFileName)
{
    cameraObject = _camera;
    program = ShaderLoader::CreateProgram("Resources/Particle.vs", "Resources/Particle.fs", "Resources/Particle.gs");


    nParticles = 400;
    for (int i = 0; i < nParticles; i++)
    {
        // Initial position starter
        vPosition.push_back(glm::vec3(0.0f));

        // Make particle
        Particle p = Particle(cameraObject,
            origin, // Position
            glm::vec3( // Velocity
                0.25 * cos(i * .0167) + 0.25f * Utils::randomFloat() - 0.125f,
                2.0f + 0.25f * Utils::randomFloat() - 0.125f,
                0.25 * sin(i * .0167) + 0.25f * Utils::randomFloat() - 0.125f),
            Utils::randomFloat() + 0.125 // Elapsed time
            );

        // Add particle to vector
        particles.push_back(p);
    }

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenVertexArrays(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vPosition.size(), vPosition.data(), GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), (GLvoid*)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);


    ParticleSystem::CreateTexture("Resources/Textures/bluefire.png", texture);
}
ParticleSystem::~ParticleSystem()
{

}
void ParticleSystem::render(float dt)
{
    glEnable(GL_DEPTH_TEST);
    for (int i = 0; i < nParticles; i++) {
        particles[i].update(dt);
        vPosition[i] = particles[i].GetPosition()*0.01f;
    }
    glm::vec3 vQuad1, vQuad2;
    glm::vec3 camFront =  cameraObject->camPos- cameraObject->camLookDir;
    camFront = glm::normalize(camFront);
    vQuad1 = glm::cross(camFront, cameraObject->camUpDir);
    vQuad1 = glm::normalize(vQuad1);
    vQuad2 = glm::cross(camFront, vQuad1);
    vQuad2 = glm::normalize(vQuad2);

    glUseProgram(program);

    glUniform3f(glGetUniformLocation(program, "vQuad1"), vQuad1.x, vQuad1.y, vQuad1.z);
    glUniform3f(glGetUniformLocation(program, "vQuad2"), vQuad2.x, vQuad2.y, vQuad2.z);

    glUniformMatrix4fv(glGetUniformLocation(program, "vp"), 1, GL_FALSE, glm::value_ptr(cameraObject->GetProjection() * cameraObject->GetView()));

    glActiveTexture(GL_TEXTURE0);
    glUniform1i(glGetUniformLocation(program, "Texture"), 0);
    glBindTexture(GL_TEXTURE_2D, texture);

    //Rendering
    glEnable(GL_BLEND);
    glDisable(GL_CULL_FACE);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glDepthMask(GL_FALSE);

    //Bind the bufferand draw the particles
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vPosition.size(), vPosition.data(), GL_STATIC_DRAW);
    glBindVertexArray(vao);
    glDrawArrays(GL_POINTS, 0, nParticles);
    glBindVertexArray(0);

    //Enable writing to depth bufferand disable blending 
    //glDepthMask(GL_TRUE);
    glDisable(GL_DEPTH_TEST);

    glDisable(GL_BLEND);

}


//Create Texture for object
void ParticleSystem::CreateTexture(const char* imageID, GLuint& tex)
{
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);

    int width, height;
    unsigned char* image = SOIL_load_image(imageID, &width, &height, 0, SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

    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_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glGenerateMipmap(GL_TEXTURE_2D);
    SOIL_free_image_data(image);
    glBindTexture(GL_TEXTURE_2D, 0);
}
#包括“ParticleSystem.h”
//依赖项包括
#包括
#包括
#包括
#包括“glm.hpp”
#包括“gtc/matrix_transform.hpp”
#包括“gtc/type_ptr.hpp”
//本地包括
#包括“Camera.h”
#包括“ShaderLoader.h”
#包括“Particle.h”
#包括“Utils.h”
//图书馆包括
#包括
#包括
ParticleSystem::ParticleSystem(glm::vec3原点,摄像头*\U摄像头,std::字符串文件名)
{
cameraObject=_摄像机;
program=ShaderLoader::CreateProgram(“Resources/Particle.vs”、“Resources/Particle.fs”、“Resources/Particle.gs”);
nParticle=400;
对于(int i=0;icamPos-cameraObject->camLookDir;
camFront=glm::normalize(camFront);
vQuad1=glm::cross(camFront,cameraObject->camUpDir);
vQuad1=glm::normalize(vQuad1);
vQuad2=glm::cross(camFront,vQuad1);
vQuad2=glm::normalize(vQuad2);
glUseProgram(程序);
glUniform3f(glGetUniformLocation(程序,“vQuad1”)、vQuad1.x、vQuad1.y、vQuad1.z);
glUniform3f(glGetUniformLocation(程序,“vQuad2”)、vQuad2.x、vQuad2.y、vQuad2.z);
glUniformMatrix4fv(glGetUniformLocation(程序,“vp”),1,GL_FALSE,glm::value_ptr(cameraObject->GetProjection()*cameraObject->GetView());
玻璃纹理(GL_纹理0);
glUniform1i(glGetUniformLocation(程序,“纹理”),0;
glBindTexture(GL_TEXTURE_2D,纹理);
//渲染
glEnable(GL_混合物);
glDisable(GLU消隐面);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
//glDepthMask(GL_FALSE);
//绑定缓冲区并绘制粒子
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GL_数组_BUFFER,sizeof(glm::vec3)*vPosition.size(),vPosition.data(),GL_STATIC_DRAW);
glBindVertexArray(vao);
GLDrawArray(GL_点,0,nParticle);
glBindVertexArray(0);
//启用写入深度缓冲区并禁用混合
//glDepthMask(GL_TRUE);
glDisable(GLU深度测试);
glDisable(GLU混合);
}
//为对象创建纹理
void ParticleSystem::CreateTexture(常量字符*imageID、GLuint和tex)
{
glGenTextures(1和tex);
glBindTexture(GL_TEXTURE_2D,tex);
int宽度、高度;
无符号字符*图像=土壤负荷图像(图像ID、宽度和高度、0、土壤负荷RGBA);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_无符号_字节,图像);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
glTexParameteri(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
GLGENATEMIPMAP(GL_纹理_2D);
无土壤图像数据(图像);
glBindTexture(GL_TEXTURE_2D,0);
}
标题

//Local Includes
#include "Camera.h"
#include "ShaderLoader.h" 
#include "Particle.h"


//Library Includes
#include <iostream>
#include <vector>


class ParticleSystem
{
public:
    ParticleSystem(glm::vec3 origin, Camera* _camera, std::string texFileName);
    ~ParticleSystem();
    void render(float dt);
    std::vector<Particle> particles;
    std::vector<glm::vec3> vPosition;
    void CreateTexture(const char* imageID, GLuint& tex);

    
    //variable members for MVP
    glm::mat4 vp;

private:
    Camera* cameraObject;
    GLuint vao;
    GLuint vbo;
    GLuint texture;
    GLuint program;
    float nParticles;
};
//本地包含
#包括“Camera.h”
#包括“ShaderLoader.h”
#包括“Particle.h”
//图书馆包括
#包括
#包括
类分词系统
{
公众:
ParticleSystem(glm::vec3原点、摄像头*\u摄像头、std::字符串文件名);
~ParticleSystem();
无效渲染(浮动dt);
向量粒子;
std::矢量位置;
void CreateTexture(常量字符*imageID、GLuint和tex);
//MVP的可变成员
glm::mat4 vp;
私人:
摄影机*摄影机对象;
GLuint-vao;
GLuint vbo;
胶合结构;
GLuint程序;
浮动nParticle;
};

如果代码仅包含文本,请不要发布代码图像(即使不是部分代码)。