void MotionBlur::draw(void) { // Get the current view matrix (according to user input through mouse, // gamepad, etc.) mViewMatrix = m_transformer->getModelViewMat(); float deltaFrameTime = getFrameDeltaTime(); // Clamp dt. If the frame rate goes very low, the stretch becomes huge // and the blurred geometry covers more of the screen which in turns // decreases the FPS even further. The sample gets into a feedback loop // of ever-decreasing FPS. const float FPS_CLAMP = 1.0f / 15.0f; if (deltaFrameTime > FPS_CLAMP) deltaFrameTime = FPS_CLAMP; // If the animation is pasued, we still want to show motion blur on the // windmill sails if (mAnimPaused) deltaFrameTime = mLastDt; mCurrSailAngle = mLastSailAngle + mSailSpeed * deltaFrameTime; // houseXform puts the axle of the sails about centre-screen. nv::matrix4f tmp; const nv::matrix4f houseXform = nv::translation(tmp, 0.0f, -10.0f, 0.0f); const nv::matrix4f currSailsXform = houseXform * sailTransform(mCurrSailAngle); const nv::matrix4f prevSailsXform = houseXform * sailTransform(mLastSailAngle); // Cleaning GL state freeGLBindings(); if (!mDoMotionBlur) renderSceneUnblurred(houseXform, currSailsXform); else renderSceneBlurred(houseXform, currSailsXform, prevSailsXform); // Cleaning GL state freeGLBindings(); // If the animation is paused, we update these values to keep the motion // blur visible in the windmill sails if (!mAnimPaused) { mLastSailAngle = mCurrSailAngle; mLastDt = deltaFrameTime; } }
void GLRenderer::render(float dt) { const float FPS_CLAMP = 1.0f / 15.0f; if (dt > FPS_CLAMP) dt = FPS_CLAMP; freeGLBindings(); if (!mPaused){ drawSceneColor(); drawSceneVelocity(); drawBlurTileMax(); drawBlurNeighbourMax(); drawBlurGather(); freeGLBindings(); } mPreviousViewMatrix = mViewMatrix; mLastDt = dt; }
void GLRenderer::render(float dt) { const float FPS_CLAMP = 1.0f / 15.0f; if (dt > FPS_CLAMP) dt = FPS_CLAMP; mElapsedTime += dt; freeGLBindings(); glm::mat4 mvp = mProjectionMatrix * mViewMatrix; glm::vec4 right = mViewMatrix[0]; glm::vec4 up = mViewMatrix[1]; mFeedbackShader->enable(); glUniform1f(mFeedbackShader->mDeltaTimeHandle, dt); glUniform1f(mFeedbackShader->mBirthRateHandle, BIRTH_RATE); glUniform3f(mFeedbackShader->mMousePositionHandle, mMousePosition.x, mMousePosition.y, mMousePosition.z); glUniform1f(mFeedbackShader->mElapsedTimeHandle, mElapsedTime); glUniform1f(mFeedbackShader->mSizeHandle, BILLBOARD_SIZE); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, mVelocityTexture); glBindVertexArray(mVAO[(mCurrentBuffer+1)%BUFFER_COUNT]); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mVBO[mCurrentBuffer]); glEnable(GL_RASTERIZER_DISCARD); glBeginTransformFeedback(GL_POINTS); glDrawArrays(GL_POINTS, 0, MAX_PARTICLES); glEndTransformFeedback(); glDisable(GL_RASTERIZER_DISCARD); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); mBillboardShader->enable(); glUniformMatrix4fv(mBillboardShader->mModelViewProjectionHandle, 1, GL_FALSE, glm::value_ptr(mvp)); glUniform3f(mBillboardShader->mRightHandle, right.x, right.y, right.z); glUniform3f(mBillboardShader->mUpHandle, up.x, up.y, up.z); glUniform1f(mBillboardShader->mBillboardSizeHandle, BILLBOARD_SIZE); glBindVertexArray(mVAO[mCurrentBuffer]); glDrawArrays(GL_POINTS, 0, MAX_PARTICLES); // mTestShader->enable(); // glUniformMatrix4fv(mTestShader->mMVP, 1, GL_FALSE, glm::value_ptr(mvp)); // glUniform1f(mTestShader->mElapsedTimeHandle, mElapsedTime); // glActiveTexture(GL_TEXTURE0); // glBindTexture(GL_TEXTURE_2D, mVelocityTexture); // mScreenQuadModel->drawArrays(); // mTestShader->disable(); mCurrentBuffer = (mCurrentBuffer + 1) % BUFFER_COUNT; }