OpenGL Transform feed back 粒子系统

OpenGL的Transform Feedback提供了一种在渲染过程中交互的能力,允许开发者在顶点处理后、图元装配和光栅化前获取顶点状态。在粒子系统中,Transform Feedback用于更新粒子相对于目标的位置和速度。首先,通过glGenTransformFeedBacks创建和glBindTransformFeedback绑定反馈对象。然后,使用glBindBufferBase或glBindBufferRange将内存缓存绑定到反馈对象。glTransformFeedbackVaryings将顶点信息与反馈对象关联。最后,通过begin、pause、resume和end操作来控制反馈数据的传输。在粒子系统示例中,Transform Feedback帮助计算粒子因碰撞而发生的反射运动。
摘要由CSDN通过智能技术生成

在原来的OpenGL渲染的pipeline并没有提供较多的交互接口,当调用Draw函数之后很难再绘制过程对已经装配的图元进行修改。然而,在绘制过程中存在这样的需求,尤其是需要根据之前装配好的图元来更新随后的操作。举个简单的例子,当一个场景中存在两个相对运动的物体时,后一个物体需要根据前一个物体的运动来决定自己的运动轨迹,因此需要有一种feed back来提升交互能力。Transform feed back就是这样一种有效的机制,Transform feed back在顶点处理好之后,图元装配和光栅化之前给程序员提供的一个接口。主要利用一个feed back缓存返回之前顶点的状态,在下一步处理中就可以根据顶点信息有效的计算下一步的运动轨迹。

Transform feed back缓存和其他的缓存一样,也存在特定的函数进行管理。首先,利用glGenTransformFeedBacks创建一个feed back数组,数组中包含的是用于管理对应的feed back的ID号,需要注意的是在创建ID号时并不会创建对应的对象,对象的创建会等到绑定的时候才会创建。绑定操作由glBindTransformFeedback完成,这个函数主要实现创建feed back对象,同时将该对象和对应的ID号码绑定;如果ID号码已经存在,则将对应的对象激活。同时OGL还提供了对应的函数用于判断feed back对象是否存在以及清除对象,这两个操作由glIsTransformFeedback以及glDeleteTransformFeedbacks两个函数完成。

创建并绑定了feed back对象之后,需要向feed back提交内存缓存,需要注意的是feed back仅仅提供一个接口,其本身并不会生成内存。和顶点队列类似,需要由其他类型的缓存为之提供背后的内存支持。将背后的内存和feed back绑定起来有两种函数调用方式,第一种是glBindBufferBase,该函数将根据提供的feed back对象的target号,将该target当做一个数组,同时将buffer中的内存与该数组中从index开始的所有内存对应起来。另外一个函数是glBindBufferRange,该函数和glBindBufferBase类似,唯一的不同是将buffer也当做一个数组,仅仅将buffer+offset到buffer+offset+size区域的内存给feed back使用。

前面主要讲了feed back的对象管理以及缓存支持,然而,feed back还没有和具体的顶点信息关联起来,那么如何使之关联并返回对应的属性值呢?这就需要用到glTransformFeedbackVaryings函数,该函数的原型如下:

void glTransformFeedbackVaryings(GLuint program​, GLsizei count​, const char **varyings​, GLenum bufferMode​);
其中program和对应的渲染程序管理,而count则用于指示有多少个feed back变量需要与feed back对象引出接口,varyings则向函数提供需要引出接口的变量的名称,最后一个参数用于管理变量存在于feed back缓存中的模式,一种是多个变量在feed back缓存中交替出现,另一种是为每一个变量关联一个对应的feed back缓存对象。需要注意的是feed back与program是对应的,当发生program切换的同时伴随feed back队列的变换。

在完成了变量与feed back缓存对象关联之后就可以开始启用transform特性并将反馈数据上传给程序员。操作feed back的命令包括begin,pause,resume以及end。下面就以红宝书上的例子《粒子系统》来详细讲解transform feed back机制的应用。

粒子系统中包括两个部分,一部分主要完成目标的渲染,第二部分主要实现粒子的更新。而粒子的位置以及速

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值