我认为比较完善的GPU粒子系统应该如下,粒子初始化可以放在CPU里,但是相关数据运算首先要放在GPU里,并且运算后的数据也应该放在显存里,而不是内存里。故用第三篇实现GPU粒子系统不满足,因为他数据是存放在纹理中,要放入VBO里,必需先读取经过内存,然后存放入显存里,这里虽然运算是放入GPU了,但是数据要经过显存-内存-显存的过程,产生不必要的消耗,并且,因为数据是存放在纹理的像素里,故限定在片断着色器中,这二个限制导致第三篇里的内容不能用来实现GPU粒子系统,而是用来实现一些需要结合CPU与GPU结合处理的运算。

在这里,我们采用OpenGL 里的Transform Feedback,和第三篇采用FBO结合浮点纹理不同,Transform Feedback简单来说,传入一个VBO,经过GPU运算后,放入另一个VBO中,注意二点,操作都是针对VBO,也就是针对显存,故不需要经过CPU与内存,还有一点就是在Transform Feedback里,一个缓存不能同时作为输入和输出。

首先来看一下简单的例子介绍Transform Feedback的基本应用,首先指出一点,GLSL3.0与GLSL4.0的Transform Feedback写法有些区别,手上分别有支持3.0与4.0的显示,但是为了更好的兼容性,选择3.0的写法,相应代码和着色器代码如下:

 简单变换反馈的着色器

 着色器基本参数设置

 Transform Feedback基本流程

着色器里代码很简单,传入一个float数据,返回二个float数据,上面我们传入一个数组,[1.0, 2.0, 3.0, 4.0, 5.0],经过着色器里简单运算,分别返回这个数据加3值,与一个固定值1.0.然后在transformFeedback我们为了验证正确与否,需要读取VBO里的数据。在这里,pyopengl可以使用glGetBufferSubData与glMapBuffer来得到VBO里的数据,需要注意的是,python与c之间的一些指针,数据的转换,引入ctype,声明ctype类型的数组,然后转换成对应的指针,填充这个数组后,然后转换把指针转化成numpy里的数组.得到的数据如下:

可以看到,传出的数据是4,1,5,1,6,1,7,1,8,1,对比传入的是1.0, 2.0, 3.0, 4.0, 5.0。验证正确。

下面我们以上面的例子来实现我们的粒子系统,这里先入相关Python代码。

 粒子系统乒乓

结合前面的例子和上文中的乒乓来看,粒子在这里我们每个定义七个数据,前三个用来表示他的位置,后三个用来表示他的速度,最后一个用来表示他在显存里的存活时间。在update就是把数据从一个缓存经过GPU运算放入另一个缓存的过程,例如第一桢,我们传入fvbo,然后数据输出到svbo.在第二桢里,数据就从svbo经过GPU传入到fvbo,第三,第四分别如第一,第二。这样就能实现如第三篇中的乒乓技术。然后在显示render里,我们就用当前输出的缓存里的数据简单的输出显示,本文只是介绍用法,实现如雪花,雨滴,瀑布等特效需要对相关初始化粒子,着色器代码,添加纹理做更改,但是基本处理还是如上。

下面是着色器代码,实现粒子与球的碰撞,也有与地面的交互。代码如下:

 粒子系统着色器代码

整个过程比较简单,也只考虑一些基本的碰撞,比如球的速度也应该影响碰撞后粒子的方向,但是这里只考虑粒子碰撞球后反射的方向,与地面的碰撞后,不会反弹,会慢慢停止向前移动。

最后一些相关着色器的参数设置代码。

 粒子系统参数设置

在本文中,试着用了5千W个粒子,发现初始化很慢,花了十几秒,但是桢数和5000个粒子基本没有差别,从这里可以看出,GPU并行处理的强大之处。

完整代码:PythonGPU粒子系统.zip 操作方式EDSF前后左右移动,WR分别向上与向下,鼠标右键加移动鼠标控制方向,V切换第一人称与第三人称。UP与DOWN切换前面操作的移动幅度。

python 粒子动画_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞相关推荐

  1. python opengl书籍_初试PyOpenGL一 (Python+OpenGL)

    很早就一直想学Python,看到一些书都有介绍,不管是做为游戏的脚本语言,还是做为开发项目的主要语言都有提及(最主要的CUDA都开始支持Python,CUDA后面一定要学),做为先熟悉一下Python ...

  2. python opengl 截图_初试PyOpenGL二 (Python+OpenGL)基本地形生成与高度检测

    在上文中,讲述了PyOpenGL的基本配置,以及网格,球形的生成,以及基本的漫游.现在利用上一篇的内容,来利用高程图实现一个基本的地形,并且,利用上文中的第三人称漫游,以小球为视角,来在地形上前后左右 ...

  3. python数据动画_[转载]Maya使用Python获取动画每帧的rotation数据

    ·············· import maya.cmds as mc import os #添加一个"Maya动画收集数据"窗口设置动画开始播放 #win = mc.wind ...

  4. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  5. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  6. python函数动画_用Python绘制几个动画

    Python中的matplotlib从1.1.0版本以后就开始支持绘制动画,Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.这 ...

  7. python表白动画_送你个情人节礼物:Python版抖音同款表白神器

    又到了一年一度的情人节!大家都准备送什么给自己心仪的对象呢? 鲜花.巧克力都太俗套了,今天给大家带来一个抖音上看到的表白神器 - 用Python写一个告白程序,让她看到你满满的爱(tao)意(lu). ...

  8. python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)

    一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...

  9. python并行运算库_最佳并行绘图Python库简介:“ HiPlot”

    python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...

最新文章

  1. Windows API一日一练(1)第一个应用程序
  2. mysql sqlite 分页查询_php基于SQLite实现的分页功能示例
  3. android studio 解决gradle加载依赖慢的问题
  4. 智能家居项目开发准备工作
  5. 手机可以实现利用putty来管理Linux服务器
  6. 在AIX 5.3+HACMP 5.4以上环境安装10gR2 10.2.0.1 RAC CRS Clusterware必须先运行Patch 6718715中的rootpre.sh...
  7. Asp.net1.0 升级 ASP.NET 2.0 的几个问题总结 (转)
  8. RayTracing练习
  9. Keil5编译环境搭建流程----STM32和GD32
  10. linux mint 中文字体,Linux Mint字体设置
  11. 安全算法—SHA-256算法
  12. 软件项目开发过程中应编写的十三类文档
  13. 超简单,自己动手写一个二维码生成器
  14. python名字排序_python 中文排序(按拼音)
  15. # 第一次面试问题详解
  16. 视频分割技巧,把视频分割成多段进行保存
  17. Linux命令老是记不住?一篇文章帮你解决。Linux常用命令汇总
  18. Mac远程Win桌面官方工具——Microsoft Remote Desktop for mac
  19. 第五人格手机游戏在PC上怎么玩?第五人格哪款模拟器好用?
  20. iOS13苹果登录的后台验证token(JAVA)

热门文章

  1. AttributeError: ‘Series‘ object has no attribute ‘as_matrix‘
  2. python与R行列数据过滤(row column filtering):dplyr、 isnull、isna、drop、select、iloc、loc、isin、filter
  3. Stacking+Blending
  4. (DCA)Decision Curve Analysis画图及意义
  5. linux 别名管理,Linux 的 15 个命令行别名, 帮系统管理员提升工作效率!
  6. 面向单细胞RNA-seq数据插补及聚类方法研究
  7. 孙立岩 python-basic: 用于学习python基础的课件(五六七八九十)
  8. mysql load data on duplicate_带有ON DUPLICATE KEY UPDATE的MySQL LOAD DATA INFILE
  9. tensorflow 张量维度变化
  10. 决策树算法详解(3)