void FireParticleSystem::Process(float delta_t) { UpdateParameters(delta_t); glUseProgram(m_animateProgram.program); CHECK_GL_ERRORS; setUniform(m_animateProgram.program, "delta_t", delta_t); setUniform(m_animateProgram.program, "wind", m_wind); //setUniform(m_animateProgram.program, "epicenter", float3(0,1,0)); glBindBuffer(GL_TEXTURE_BUFFER, m_posAndSizeBuffers[1-m_currPinPongId]); CHECK_GL_ERRORS; bindTextureBuffer(m_animateProgram.program, 1, "vertPosBuffer", m_vertexPosTBO); CHECK_GL_ERRORS; glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_vertexPosTBO); CHECK_GL_ERRORS; glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_posAndSizeBuffers[m_currPinPongId]); CHECK_GL_ERRORS; glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, m_velAndHPBuffers[m_currPinPongId]); CHECK_GL_ERRORS; glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, m_randBuffers[m_currPinPongId]); CHECK_GL_ERRORS; glEnable(GL_RASTERIZER_DISCARD); glBeginTransformFeedback(GL_POINTS); CHECK_GL_ERRORS; glBindVertexArray(m_animVAOs[1-m_currPinPongId]); CHECK_GL_ERRORS; glDrawArrays(GL_POINTS, 0, m_particlesNum); CHECK_GL_ERRORS; glBindVertexArray(0); glEndTransformFeedback(); CHECK_GL_ERRORS; glDisable(GL_RASTERIZER_DISCARD); glBindBuffer(GL_TEXTURE_BUFFER, 0); glBindTexture(GL_TEXTURE_BUFFER, 0); m_currPinPongId = 1 - m_currPinPongId; m_lastDeltaTime = delta_t; }
/*---------------------------------------------*/ void COpenGLTextureBufferObject::initTBOBuffer(int nJointCount, GLenum iUsageHint) { m_pRenderDevice->extGlBufferData(GL_TEXTURE_BUFFER, 12 * nJointCount * sizeof(GLfloat), NULL, iUsageHint); bindTextureBuffer(0); m_pRenderDevice->extGlTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_TBOID); }