transform feedback object 理解

本文深入探讨了使用OpenGL和transform feedback技术进行粒子系统实时更新的方法。通过详细的代码解析,展示了如何利用GPU加速粒子效果的更新过程,包括新粒子的生成与旧粒子的状态更新,实现了高效的粒子渲染。

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

void UpdateParticle()
{
	//printf("current particle buffer tfo %d %d\n",currentParticleTFO, currentParticleTFOForDraw);
	int currentOldParticleBufferIndex = currentParticleTFOForDraw;
	if (particleCount==-1)
	{
		particleCount++;
	}
	else
	{
		glGetQueryObjectiv(queryObject, GL_QUERY_RESULT,&particleCount);
	}
	GL_CALL(glEnable(GL_RASTERIZER_DISCARD));
	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, updateParticleTFO[currentParticleTFO]);
	glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queryObject);
	glUseProgram(updateParticleProgram);
	glBeginTransformFeedback(GL_POINTS);
	//new emitted particle update
	if (bEmitNewParticle)
	{
		bEmitNewParticle = false;
		//update particle : write new particle to some buffer via transform feedback technique
		glBindBuffer(GL_ARRAY_BUFFER, tfoNewParticleBuffer);
		glEnableVertexAttribArray(updateParticleProgramPosLocation);
		glVertexAttribPointer(updateParticleProgramPosLocation, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glDrawTransformFeedback(GL_POINTS, tfoNewParticle);
	}
	//update old particle : write old particle to some buffer via transform feedback technique
	if (particleCount>0)
	{
		glBindBuffer(GL_ARRAY_BUFFER, updateParticleTFOBuffer[currentOldParticleBufferIndex]);
		glEnableVertexAttribArray(updateParticleProgramPosLocation);
		glVertexAttribPointer(updateParticleProgramPosLocation, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glDrawTransformFeedback(GL_POINTS, updateParticleTFO[currentOldParticleBufferIndex]);
	}
	glEndTransformFeedback();
	glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
	glUseProgram(0);
	glDisable(GL_RASTERIZER_DISCARD);
	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
	currentParticleTFOForDraw = currentParticleTFO;

	//glBindBuffer(GL_ARRAY_BUFFER, updateParticleTFOBuffer[currentParticleTFOForDraw]);
	//FloatBundle*vertexes = (FloatBundle*)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
	//printf("%f,%f,%f,%f\n",vertexes[0].v[0], vertexes[0].v[1], vertexes[0].v[3], vertexes[0].v[3]);
	//glUnmapBuffer(GL_ARRAY_BUFFER);
	//glBindBuffer(GL_ARRAY_BUFFER, 0);
	currentParticleTFO = (currentParticleTFO + 1) % 2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值