Esempio n. 1
0
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;
}
Esempio n. 3
0
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;
}