声明:因网易博客将关闭,移到此
/**
这里使用到的是opengl 和 glut 进行编写学习的笔记,一个简单的出口
使用到的开发库有 linux (gl glu glut) windows(opengl32.lib glu32.lib glut32.lib)
实现: 粒子效果
例子:
这里使用的是raw作为粒子的纹理,(raw 读取没有具体去看,不知道是否其他有不相同
这个是用nehe第19课拿出来的,可以去
http://nehe.gamedev.net/tutorial/particle_engine_using_triangle_strips/21001/)
键盘部分
方向键,上下,左右,分别控制粒子的x,y加速度
home键初始化粒子
end 控制控制颜色
w,s 控制y方向的速度
a,d 控制x方向的速度
pageup,pagedown 控制z方向
q,e 控制速度
还有其他键,那要自己去看代码了,^_^
问题:
1.如果我要绘制粒子我又要绘制各种3D物体那怎么办呢?
当你绘制模型,又添加了粒子会发现怪怪的地方,那就是
粒子关闭了深度测试,而绘制3D我体又要打开,
在绘制模型的时候打开深度测试,在使用粒子的时候关闭深度测试
...看代码吧,(*^__^*) 嘻嘻……
*/
#include <iostream>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#endif
#ifdef __GNUC__
#include <unistd.h>
#endif
#define MAX_PARTICLES 1000
using namespace std;
// 图片的类型 包含宽 高 数据
struct Image
{
unsigned long sizeX;
unsigned long sizeY;
char *data;
};
typedef struct Image Image;
//
static GLfloat g_colors[12][3] =
{
{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
{0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
{0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}
};
// 存储粒子的结构体
struct particles
{
bool active; //
float life; // 粒子的生命
float fade; // 粒子衰减速度
float x,y,z; // 粒子的位置
float r,g,b; // 粒子的颜色
float xi,yi,zi; // 粒子的速度
float xg,yg,zg; // 粒子的加速度
};
particles particle[MAX_PARTICLES];
// 我们用来旋转下模型吧
GLuint g_texture;
GLuint g_btexture;
float g_angle = 0;
float g_zoom = -40;
float g_slowdown = 2.0f;
float g_xspeed;
float g_yspeed;
int i;
GLuint col = 0;
GLuint g_delay;
bool g_rainbow = true; // 彩虹
bool g_sp; // 空格?
bool g_rp; // enter?
bool keys[512];
////////////////////////////////
// 下面是读取自定义格式的模型信息文件使用的函数
//----------------------------------------------------------
// 读取图片文件
int ImageLoad(const char *filename, Image *image)
{
FILE *file;
unsigned long size; // 图片长度
unsigned long i; // 计数
unsigned short int planes;
unsigned short int bpp;
char temp; // bgr -rgb 变换
if ((file = fopen(filename, "rb")) == NULL)
{
printf("File Not Found: %s\n", filename);
return 0;
}
// 跳过文件的头部,准备读取宽度和高度
// 如果想自己具体的情况可以去看看bmp图片的相关信息
fseek(file, 18, SEEK_CUR);
// 读取宽度
if ((i = fread(&image->sizeX, 4, 1, file)) != 1)
{
printf("Error reading width from %s. \n", filename);
return 0;
}
printf("Width of %s: %lu\n", filename, image->sizeX);
// 读取宽度
if ((i = fread(&image->sizeY, 4, 1, file)) != 1)
{
printf("Error reading height from %s. \n", filename);
return 0;
}
printf("Height of %s: %lu\n", filename, image->sizeY);
// 计算长度(24bits或3bytes每个像素)
size = image->sizeX * image->sizeY * 3;
// 读取
if