[迁移]opengl学习从头开始(笔记15 粒子效果)

这是一篇关于OpenGL的学习笔记,主要介绍了如何从零开始创建粒子效果。由于网易博客即将关闭,作者将内容迁移至此。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:因网易博客将关闭,移到此

/**
    这里使用到的是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值