问题描述
在OpenGL工作中,我做了一些高级图形处理。我必须显示的一项汇总技术是添加一个Fire cpu粒子系统。需要使用广告牌四边形。我确实有一个粒子系统正在工作,但是出了点问题。它具有粒子系统,但不在地形上或不在我的地形上显示(蓝色圆圈)。也是我的立方体变形了(红色圆圈)。
代码如下:
我确实从中感觉到了
或从此
两种方式都无法在下面将代码发布
.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 (将#修改为@)