python粒子特效_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞

这篇相当于是对前三篇的总结,基本效果如下:

我认为比较完善的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的写法,相应代码和着色器代码如下:

1 tf_v = """2 #version 330

3 in floatinValue;4 out floatoutValue;5 out floatout2;6 voidmain() {7 outValue = inValue+3.0;8 out2 = 1.0;9 }"""

简单变换反馈的着色器

1 this.tfProgram =glCreateProgram()2 this.tfProgram =ShaderProgram(this.tfProgram)3 tfvshader =shaders.compileShader(tf_v,GL_VERTEX_SHADER)4 glAttachShader(this.tfProgram,tfvshader)5 LP_LP_c_char =POINTER(POINTER(c_char))6 ptrs = (c_char_p * 2)('outValue', 'out2')7 printptrs,len(ptrs)8 c_array =cast(ptrs, LP_LP_c_char)9 glTransformFeedbackVaryings(this.tfProgram, len(ptrs), c_array, GL_INTERLEAVED_ATTRIBS)10 glLinkProgram(this.tfProgram)11 this.tfProgram.invalue = glGetAttribLocation(this.tfProgram,"inValue")

着色器基本参数设置

1 classtransformFeedback(common):2 def __init__(this,pro):3 data = [1.0, 2.0, 3.0, 4.0, 5.0]4 data1 = [1.0] * 5

5 this.vbo &

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值