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

问题描述

在OpenGL工作中,我做了一些高级图形处理。我必须显示的一项汇总技术是添加一个Fire cpu粒子系统。需要使用广告牌四边形。我确实有一个粒子系统正在工作,但是出了点问题。它具有粒子系统,但不在地形上或不在我的地形上显示(蓝色圆圈)。也是我的立方体变形了(红色圆圈)。

example of the problem here

代码如下:

我确实从中感觉到了

Image of code

或从此

Image of code

两种方式都无法在下面将代码发布

.cpp

#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,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,GL_STATIC_DRAW);
    glBindVertexArray(vao);
    glDrawArrays(GL_POINTS,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,SOIL_LOAD_RGBA);
    glTexImage2D(GL_TEXTURE_2D,GL_RGBA,width,height,GL_UNSIGNED_BYTE,image);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,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);
}

标题

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


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


class ParticleSystem
{
public:
    ParticleSystem(glm::vec3 origin,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;
};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)