Ejemplo n.º 1
0
//  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();
}
Ejemplo n.º 2
0
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();
	}
}