// Draws the skybox with lighting in color and depth void MotionBlur::drawSkybox(void) const { if (!mDrawSky) return; // Skybox computations use the camera matrix (inverse of the view matrix) const nv::matrix4f invVM = nv::inverse(mViewMatrix); mSkyboxColorShader->enable(); // In BaseProjectionShader glUniformMatrix4fv(mSkyboxColorShader->projectionMatUHandle, 1, GL_FALSE, mInverseProjMatrix._array); // In SkyboxColorShader glUniformMatrix4fv(mSkyboxColorShader->inverseViewMatUHandle, 1, GL_FALSE, invVM._array); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, mSkyBoxTexID); glUniform1i(mSkyboxColorShader->skyboxCubemapTexUHandle, 0); drawScreenAlignedQuad(mSkyboxColorShader->positionAHandle); mSkyboxColorShader->disable(); }
void Mercury::draw(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (mReset) { mReset = false; mParticles->reset(); mTweakBar->syncValues(); } // // Compute matrices without the legacy matrix stack support // nv::matrix4f projectionMatrix; nv::perspective( projectionMatrix, 45.0f * 2.0f*3.14159f / 360.0f, (float)m_width/(float)m_height, 0.1f, 10.0f); nv::matrix4f viewMatrix = m_transformer->getModelViewMat(); // // update struct representing UBO // mShaderParams.numParticles = mParticles->getSize(); mShaderParams.ModelView = viewMatrix; mShaderParams.InvViewMatrix = inverse(viewMatrix); mShaderParams.ModelViewProjection = projectionMatrix * viewMatrix; mShaderParams.ProjectionMatrix = projectionMatrix; // bind the buffer for the UBO, and update it with the latest values from the CPU-side struct glBindBufferBase(GL_UNIFORM_BUFFER, 1, mUBO); glBindBuffer( GL_UNIFORM_BUFFER, mUBO); glBufferSubData( GL_UNIFORM_BUFFER, 0, sizeof(ShaderParams), &mShaderParams); if (mAnimate) { float timeDelta = getFrameDeltaTime(); mParticles->update(timeDelta); } else { // float timeDelta = getFrameDeltaTime(); mParticles->update(0); } // Display Binary Space Partitions if (mPolygonize) { mSurfaceRenderProg->enable(); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); uint32_t cellsDim = mParticles->getMCPolygonizer()->getCellsDim(); mShaderParams.cellsize = mParticles->getMCPolygonizer()->getCellSize(); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); // Bind packed vertex-isovalue buffer. glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, mParticles->getMCPolygonizer()->getPackedPosValBuffer()); // Bind triangle list hash table for marching cubes algorithm to be referenced from Geometry Shader glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, mParticles->getMCPolygonizer()->getTriTableBuffer()); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mParticles->getMCPolygonizer()->getIndexBuffer()); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_CUBE_MAP, mSkyBoxTexID); GLuint loc = glGetUniformLocation(mSurfaceRenderProg->getProgram(), "skyBoxTex"); glProgramUniform1i(mSurfaceRenderProg->getProgram(), loc, 1); glDrawElements(GL_TRIANGLES, cellsDim * cellsDim * cellsDim * 3, GL_UNSIGNED_INT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, 0); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, 0); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glBindFramebuffer(GL_FRAMEBUFFER, 0); mSurfaceRenderProg->disable(); glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw final scene mQuadProg->enable(); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, gbuffer_tex[0]); loc = glGetUniformLocation(mQuadProg->getProgram(), "gbuf0"); glProgramUniform1i(mQuadProg->getProgram(), loc, 3); glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, gbuffer_tex[1]); loc = glGetUniformLocation(mQuadProg->getProgram(), "gbuf1"); glProgramUniform1i(mQuadProg->getProgram(), loc, 4); glActiveTexture(GL_TEXTURE5); glBindTexture(GL_TEXTURE_2D, gbuffer_tex[2]); loc = glGetUniformLocation(mQuadProg->getProgram(), "gbuf2"); glProgramUniform1i(mQuadProg->getProgram(), loc, 5); drawScreenAlignedQuad(mQuadProg->getProgram()); mQuadProg->disable(); } else { mParticlesRenderProg->enable(); // draw particles glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); // additive blend glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, mParticles->getPosBuffer()->getBuffer()); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mParticles->getIndexBuffer()->getBuffer()); glDrawElements(GL_TRIANGLES, mParticles->getSize() * 6, GL_UNSIGNED_INT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, 0); glDisable(GL_BLEND); mParticlesRenderProg->disable(); } }