示例#1
0
//----------------------------------------------------------------------------
void ObjLoadingTestApp::Initialize(GPUDevice* device)
{
    float color = 0.0f;
    glClearColor(color, color, color, 0.0f);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    // Create scene camera.
    mMainCamera->SetPerspectiveFrustum(45.0f, (float)Width / (float)Height, 0.01f, 150.0f);
    mMainCamera->SetLookAt(vec3(0.0f, 10.0f, 35.0f), vec3(0.0f, 10.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

    // Create material templates.
    Material* material = 0;

    ShaderProgramInfo objMeshProgramInfo;
    objMeshProgramInfo.VShaderFileName = "ObjLoadingTest/vObjMesh.glsl";
    objMeshProgramInfo.FShaderFileName = "ObjLoadingTest/fObjMesh.glsl";
    objMeshProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                         ShaderType::ST_Fragment;
    Pass* passObjMesh = new Pass(objMeshProgramInfo);

    Technique* techObjMesh = new Technique();
    techObjMesh->AddPass(passObjMesh);
    MaterialTemplate* mtObjMesh = new MaterialTemplate();
    mtObjMesh->AddTechnique(techObjMesh);

    // Create scene.
    mat4 rotM;
    material = new Material(mtObjMesh);
    mModel = new ObjMesh(material, mMainCamera);
    mModel->LoadFromOBJFile("elephant-gallop/elephant-gallop-1.obj");
    mModel->GenerateNormals();
    mModel->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-60.0f), vec3(0, 1, 0));
    mModel->SetWorldTransform(rotM);
    mModel->SetWorldTranslation(vec3(3.2f, 3.6f, 2.4f));
    mModel->SetWorldScale(vec3(9.0f));
}
示例#2
0
文件: SIIApp.cpp 项目: jazzboysc/RTGI
//----------------------------------------------------------------------------
void SIIApp::Initialize(GPUDevice* device)
{
	float color = 0.0f;
	glClearColor(color, color, color, 0.0f);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    
    // Create scene camera.
	mMainCamera->SetPerspectiveFrustum(45.0f, (float)Width/(float)Height, 0.01f, 50.0f);
	mMainCamera->SetLookAt(vec3(0.0f, 10.0f, 35.0f), vec3(0.0f, 10.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

    // Create light projector.
    mLightProjector = new Camera();
    mLightProjector->SetPerspectiveFrustum(85.0f, 1.0f, 0.01f, 50.0f);
    mLightProjector->SetLookAt(vec3(0.0f, 10.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f),
        vec3(1.0f, 0.0f, 0.0f));

	// Create material templates.
	Material* material = 0;
    ShaderProgramInfo programInfo;
    programInfo.VShaderFileName = "SplattingIndirectIllumination/vVPLShadow.glsl";
    programInfo.FShaderFileName = "SplattingIndirectIllumination/fVPLShadow.glsl";
    programInfo.TCShaderFileName = "SplattingIndirectIllumination/tcVPLShadow.glsl";
    programInfo.TEShaderFileName = "SplattingIndirectIllumination/teVPLShadow.glsl";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex | 
                                  ShaderType::ST_Fragment | 
                                  ShaderType::ST_TessellationControl |
                                  ShaderType::ST_TessellationEvaluation;
    Pass* passShadow = new Pass(programInfo);

    programInfo.VShaderFileName = "SplattingIndirectIllumination/vScene.glsl";
    programInfo.FShaderFileName = "SplattingIndirectIllumination/fScene.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                  ShaderType::ST_Fragment;
    Pass* passScene = new Pass(programInfo);

    programInfo.VShaderFileName = "SplattingIndirectIllumination/vRSMBuffer.glsl";
    programInfo.FShaderFileName = "SplattingIndirectIllumination/fRSMBuffer.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
        ShaderType::ST_Fragment;
    Pass* passRSMBuffer = new Pass(programInfo);

	Technique* techSII = new Technique();
    techSII->AddPass(passShadow);
    techSII->AddPass(passRSMBuffer);
    techSII->AddPass(passScene);
	MaterialTemplate* mtSII = new MaterialTemplate();
    mtSII->AddTechnique(techSII);

    programInfo.VShaderFileName = "SplattingIndirectIllumination/vSampleRSMBuffer.glsl";
    programInfo.FShaderFileName = "SplattingIndirectIllumination/fSampleRSMBuffer.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
        ShaderType::ST_Fragment;
    Pass* passVPLQuad = new Pass(programInfo);

    Technique* techVPLQuad = new Technique();
    techVPLQuad->AddPass(passVPLQuad);
    MaterialTemplate* mtVPLQuad = new MaterialTemplate();
    mtVPLQuad->AddTechnique(techVPLQuad);

    programInfo.VShaderFileName = "SplattingIndirectIllumination/vSIITemp.glsl";
    programInfo.FShaderFileName = "SplattingIndirectIllumination/fSIITemp.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                  ShaderType::ST_Fragment;
    Pass* passScreenQuad = new Pass(programInfo);

    Technique* techScreenQuad = new Technique();
    techScreenQuad->AddPass(passScreenQuad);
    MaterialTemplate* mtScreenQuad = new MaterialTemplate();
    mtScreenQuad->AddTechnique(techScreenQuad);

    // Create shadow map render target.
    int shadowMapWidth, shadowMapHeight;
    shadowMapWidth = 1024;
    shadowMapHeight = 1024;
    mShadowMapTexture = new Texture2D();
    mShadowMapTexture->CreateRenderTarget(mDevice, shadowMapWidth, 
        shadowMapHeight, BF_RGBF);

    mShadowMapDepthTexture = new Texture2D();
    mShadowMapDepthTexture->CreateRenderTarget(mDevice, shadowMapWidth, 
        shadowMapHeight, BF_Depth);

    // Create shadow map frame buffer.
    Texture* renderTargets[] = { mShadowMapTexture };
    mShadowMapFB = new FrameBuffer(mDevice);
    mShadowMapFB->SetRenderTargets(1, renderTargets, mShadowMapDepthTexture);

    // Create RSM-buffer MRT textures.
    int RSMWidth = 1024;
    int RSMHeight = 1024;
    mRSMPositionTexturePX = new Texture2D();
    mRSMPositionTexturePX->CreateRenderTarget(mDevice, RSMWidth, RSMHeight, 
        BF_RGBF);
    mRSMNormalTexturePX = new Texture2D();
    mRSMNormalTexturePX->CreateRenderTarget(mDevice, RSMWidth, RSMHeight, 
        BF_RGBF);
    mRSMFluxTexturePX = new Texture2D();
    mRSMFluxTexturePX->CreateRenderTarget(mDevice, RSMWidth, RSMHeight, 
        BF_RGBF);
    mRSMDepthTexturePX = new Texture2D();
    mRSMDepthTexturePX->CreateRenderTarget(mDevice, RSMWidth, RSMHeight, 
        BF_Depth);

    // Create RSM-buffer.
    Texture* rsmTextures[3] = { mRSMPositionTexturePX, mRSMNormalTexturePX, mRSMFluxTexturePX };
    mRSMBufferPX = new FrameBuffer(mDevice);
    mRSMBufferPX->SetRenderTargets(3, rsmTextures, mRSMDepthTexturePX);

    // Create RSM sample texture.
    mRSMSampleTexture = new Texture1D();
    mRSMSampleTexture->CreateUniformRandomTexture(mDevice, 128, 2);

    // Create VPL quad.
    material = new Material(mtVPLQuad);
    mVPLQuad = new SIIVPLQuad(material, mMainCamera);
    mVPLQuad->LoadFromPLYFile("screenquad.ply");
    mVPLQuad->CreateDeviceResource(mDevice);
    mVPLQuad->IsQuad = true;
    mVPLQuad->RSMPositionTexture = mRSMPositionTexturePX;
    mVPLQuad->RSMNormalTexture = mRSMNormalTexturePX;
    mVPLQuad->RSMFluxTexture = mRSMFluxTexturePX;
    mVPLQuad->RSMSampleTexture = mRSMSampleTexture;

	// Create scene.
	mat4 rotM;
	material = new Material(mtSII);
	mModel = new SIITriMesh(material, mMainCamera);
	mModel->LoadFromPLYFile("cow.ply");
    mat4 scale = glm::scale(mat4(), vec3(2.0f));
    mModel->UpdateModelSpaceVertices(scale);
	mModel->GenerateNormals();
	mModel->CreateDeviceResource(mDevice);
	mModel->SetWorldTranslation(vec3(-2.0f, 3.0f, 3.0f));
	mModel->MaterialColor = vec3(0.65f, 0.65f, 0.65f);
    mModel->LightProjector = mLightProjector;
    mModel->ShadowMap = mShadowMapTexture;

    material = new Material(mtSII);
	mGround = new SIITriMesh(material, mMainCamera);
	mGround->LoadFromPLYFile("square.ply");
	mGround->GenerateNormals();
	mGround->CreateDeviceResource(mDevice);
    mGround->MaterialColor = vec3(0.5f, 0.0f, 0.0f);
    mGround->LightProjector = mLightProjector;
    mGround->ShadowMap = mShadowMapTexture;

    material = new Material(mtSII);
	mCeiling = new SIITriMesh(material, mMainCamera);
	mCeiling->LoadFromPLYFile("square.ply");
	mCeiling->GenerateNormals();
	mCeiling->CreateDeviceResource(mDevice);
	rotM = rotate(mat4(), radians(180.0f), vec3(1, 0, 0));
	mCeiling->SetWorldTransform(rotM);
	mCeiling->SetWorldTranslation(vec3(0.0f, 20.0f, 0.0f));
    mCeiling->MaterialColor = vec3(0.0f, 0.0f, 0.75f);
    mCeiling->LightProjector = mLightProjector;
    mCeiling->ShadowMap = mShadowMapTexture;

    material = new Material(mtSII);
	mBackWall = new SIITriMesh(material, mMainCamera);
	mBackWall->LoadFromPLYFile("square.ply");
	mBackWall->GenerateNormals();
	mBackWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(1, 0, 0));
	mBackWall->SetWorldTransform(rotM);
	mBackWall->SetWorldTranslation(vec3(0.0f, 10.0f, -10.0f));
    mBackWall->MaterialColor = vec3(0.75f, 0.75f, 0.75f);
    mBackWall->LightProjector = mLightProjector;
    mBackWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtSII);
	mLeftWall = new SIITriMesh(material, mMainCamera);
	mLeftWall->LoadFromPLYFile("square.ply");
	mLeftWall->GenerateNormals();
	mLeftWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-90.0f), vec3(0, 0, 1));
	mLeftWall->SetWorldTransform(rotM);
	mLeftWall->SetWorldTranslation(vec3(-10.0f, 10.0f, 0.0f));
    mLeftWall->MaterialColor = vec3(1.0f, 0.0f, 0.0f);
    mLeftWall->LightProjector = mLightProjector;
    mLeftWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtSII);
	mRightWall = new SIITriMesh(material, mMainCamera);
	mRightWall->LoadFromPLYFile("square.ply");
	mRightWall->GenerateNormals();
	mRightWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(0, 0, 1));
	mRightWall->SetWorldTransform(rotM);
	mRightWall->SetWorldTranslation(vec3(10.0f, 10.0f, 0.0f));
    mRightWall->MaterialColor = vec3(0.0f, 1.0f, 0.0f);
    mRightWall->LightProjector = mLightProjector;
    mRightWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtScreenQuad);
    mShadowMapScreenQuad = new SIITempScreenQuad(material);
	mShadowMapScreenQuad->LoadFromPLYFile("screenquad.ply");
    mShadowMapScreenQuad->SetTCoord(0, vec2(0.0f, 0.0f));
    mShadowMapScreenQuad->SetTCoord(1, vec2(1.0f, 0.0f));
    mShadowMapScreenQuad->SetTCoord(2, vec2(1.0f, 1.0f));
    mShadowMapScreenQuad->SetTCoord(3, vec2(0.0f, 1.0f));
    mShadowMapScreenQuad->CreateDeviceResource(mDevice);
    mShadowMapScreenQuad->TempTexture = mShadowMapTexture;
}
示例#3
0
//----------------------------------------------------------------------------
void SSSviaPSMApp::Initialize(GPUDevice* device)
{

	float color = 1.0f;
	glClearColor(color, color, color, 0.0f);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    // Create scene camera.
	mMainCamera->SetPerspectiveFrustum(45.0f, (float)Width/(float)Height, 0.01f, 50.0f);
	mMainCamera->SetLookAt(vec3(0.0f, 10.0f, 35.0f), vec3(0.0f, 10.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

    // Create light projector.
    mLightProjector = new Camera();
    mLightProjector->SetPerspectiveFrustum(45.0f, (float)Width / (float)Height, 0.01f, 50.0f);
    mLightProjector->SetLookAt(vec3(0.0f, 5.0f, -9.5f), vec3(0.0f, 5.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

	// Create material templates.
	Material* material = 0;
    ShaderProgramInfo programInfo;
    programInfo.VShaderFileName = "SSSviaPSM/vShadow.glsl";
    programInfo.FShaderFileName = "SSSviaPSM/fShadow.glsl";
    programInfo.TCShaderFileName = "SSSviaPSM/tcShadow.glsl";
    programInfo.TEShaderFileName = "SSSviaPSM/teShadow.glsl";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex | 
                                  ShaderType::ST_Fragment | 
                                  ShaderType::ST_TessellationControl |
                                  ShaderType::ST_TessellationEvaluation;
    Pass* passShadow = new Pass(programInfo);
    programInfo.VShaderFileName = "SSSviaPSM/vScene.glsl";
    programInfo.FShaderFileName = "SSSviaPSM/fScene.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                  ShaderType::ST_Fragment;
    Pass* passScene = new Pass(programInfo);
	Technique* techISM = new Technique();
    techISM->AddPass(passShadow);
    techISM->AddPass(passScene);
	MaterialTemplate* mtISM = new MaterialTemplate();
	mtISM->AddTechnique(techISM);

    programInfo.VShaderFileName = "SSSviaPSM/vSSSviaPSMTemp.glsl";
    programInfo.FShaderFileName = "SSSviaPSM/fSSSviaPSMTemp.glsl";
    programInfo.TCShaderFileName = "";
    programInfo.TEShaderFileName = "";
    programInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                  ShaderType::ST_Fragment;
    Pass* passScreenQuad = new Pass(programInfo);
    Technique* techScreenQuad = new Technique();
    techScreenQuad->AddPass(passScreenQuad);
    MaterialTemplate* mtScreenQuad = new MaterialTemplate();
    mtScreenQuad->AddTechnique(techScreenQuad);

    // Create shadow map render target.
    int shadowMapWidth, shadowMapHeight;
    shadowMapWidth = 1024;
    shadowMapHeight = 1024;
    mShadowMapTexture = new Texture2D();
    mShadowMapTexture->CreateRenderTarget(mDevice, shadowMapWidth, 
        shadowMapHeight, BF_RGBF);

    mShadowMapDepthTexture = new Texture2D();
    mShadowMapDepthTexture->CreateRenderTarget(mDevice, shadowMapWidth,
        shadowMapHeight, BF_Depth);

    // Create shadow map frame buffer.
    Texture* renderTargets[] = { mShadowMapTexture };
    mShadowMapFB = new FrameBuffer(mDevice);
    mShadowMapFB->SetRenderTargets(1, renderTargets, mShadowMapDepthTexture);

	// Create scene.
	mat4 rotM;
	material = new Material(mtISM);
	mModel = new SSSviaPSMTriMesh(material, mMainCamera);
	mModel->LoadFromPLYFile("dragon_s.ply");
    mat4 scale = glm::scale(mat4(), vec3(60.0f));
    //mat4 scale = Scale(vec3(1.0f));
    mModel->UpdateModelSpaceVertices(scale);
	mModel->GenerateNormals();
	mModel->CreateDeviceResource(mDevice);
	mModel->SetWorldTranslation(vec3(0.0f, 4.0f, 0.0f));
    //mModel->SetWorldTranslation(vec3(0.0f, 6.0f, 0.0f));
	mModel->MaterialColor = vec3(0.15f, 0.55f, 0.35f);
    mModel->LightProjector = mLightProjector;
    mModel->ShadowMap = mShadowMapTexture;
    mModel->IsSSS = true;

    material = new Material(mtISM);
	mGround = new SSSviaPSMTriMesh(material, mMainCamera);
	mGround->LoadFromPLYFile("square.ply");
	mGround->GenerateNormals();
	mGround->CreateDeviceResource(mDevice);
    mGround->MaterialColor = vec3(0.8f, 0.8f, 0.8f);
    mGround->LightProjector = mLightProjector;
    mGround->ShadowMap = mShadowMapTexture;

    material = new Material(mtISM);
	mCeiling = new SSSviaPSMTriMesh(material, mMainCamera);
	mCeiling->LoadFromPLYFile("square.ply");
	mCeiling->GenerateNormals();
	mCeiling->CreateDeviceResource(mDevice);
	rotM = rotate(mat4(),  radians(180.0f), vec3(1, 0, 0));
	mCeiling->SetWorldTransform(rotM);
	mCeiling->SetWorldTranslation(vec3(0.0f, 20.0f, 0.0f));
    mCeiling->MaterialColor = vec3(0.0f, 0.0f, 0.75f);
    mCeiling->LightProjector = mLightProjector;
    mCeiling->ShadowMap = mShadowMapTexture;

    material = new Material(mtISM);
	mBackWall = new SSSviaPSMTriMesh(material, mMainCamera);
	mBackWall->LoadFromPLYFile("square.ply");
	mBackWall->GenerateNormals();
	mBackWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(1, 0, 0));
	mBackWall->SetWorldTransform(rotM);
	mBackWall->SetWorldTranslation(vec3(0.0f, 10.0f, -10.0f));
    mBackWall->MaterialColor = vec3(0.75f, 0.75f, 0.75f);
    mBackWall->LightProjector = mLightProjector;
    mBackWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtISM);
	mLeftWall = new SSSviaPSMTriMesh(material, mMainCamera);
	mLeftWall->LoadFromPLYFile("square.ply");
	mLeftWall->GenerateNormals();
	mLeftWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-90.0f), vec3(0, 0, 1));
	mLeftWall->SetWorldTransform(rotM);
	mLeftWall->SetWorldTranslation(vec3(-10.0f, 10.0f, 0.0f));
    mLeftWall->MaterialColor = vec3(1.0f, 0.0f, 0.0f);
    mLeftWall->LightProjector = mLightProjector;
    mLeftWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtISM);
	mRightWall = new SSSviaPSMTriMesh(material, mMainCamera);
	mRightWall->LoadFromPLYFile("square.ply");
	mRightWall->GenerateNormals();
	mRightWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(0, 0, 1));
	mRightWall->SetWorldTransform(rotM);
	mRightWall->SetWorldTranslation(vec3(10.0f, 10.0f, 0.0f));
    mRightWall->MaterialColor = vec3(0.0f, 1.0f, 0.0f);
    mRightWall->LightProjector = mLightProjector;
    mRightWall->ShadowMap = mShadowMapTexture;

    material = new Material(mtScreenQuad);
    mShadowMapScreenQuad = new SSSviaPSMTempScreenQuad(material);
    mShadowMapScreenQuad->LoadFromPLYFile("screenquad.ply");
    mShadowMapScreenQuad->SetTCoord(0, vec2(0.0f, 0.0f));
    mShadowMapScreenQuad->SetTCoord(1, vec2(1.0f, 0.0f));
    mShadowMapScreenQuad->SetTCoord(2, vec2(1.0f, 1.0f));
    mShadowMapScreenQuad->SetTCoord(3, vec2(0.0f, 1.0f));
    mShadowMapScreenQuad->CreateDeviceResource(mDevice);
    mShadowMapScreenQuad->TempTexture = mShadowMapTexture;
}
示例#4
0
//----------------------------------------------------------------------------
void VPLviaSVOGI::Initialize(GPUDevice* device)
{
	float color = 0.0f;
    glClearColor(color, color, color, 0.0f);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    
    // Create scene camera.
	mMainCamera->SetPerspectiveFrustum(45.0f, (float)Width/(float)Height, 0.01f, 150.0f);
	mMainCamera->SetLookAt(vec3(0.0f, 10.0f, 35.0f), vec3(0.0f, 10.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

    // Create light manager.
    mLightManager = new LightManager(device);

    // Create scene lights.

    //LightProjectorDesc pointLight1ProjDesc;
    //pointLight1ProjDesc.UpFovDegrees = 90.0f;
    //pointLight1ProjDesc.AspectRatio = 1.0f;
    //pointLight1ProjDesc.NearPlane = 0.01f;
    //pointLight1ProjDesc.FarPlane = 50.0f;
    //pointLight1ProjDesc.Location = vec3(2.0f, 12.0f, 2.0f);
    //pointLight1ProjDesc.LookAt = vec3(0.0f, 0.0f, 0.0f);
    //pointLight1ProjDesc.Up = vec3(1.0f, 0.0f, 0.0f);
    //PointLightDesc light1Desc;
    //light1Desc.Intensity = vec3(50.0f, 50.0f, 50.0f);
    //mLightManager->CreatePointLight(&pointLight1ProjDesc, mMainCamera, &light1Desc);

    //LightProjectorDesc pointLight2ProjDesc;
    //pointLight2ProjDesc.UpFovDegrees = 90.0f;
    //pointLight2ProjDesc.AspectRatio = 1.0f;
    //pointLight2ProjDesc.NearPlane = 0.01f;
    //pointLight2ProjDesc.FarPlane = 50.0f;
    //pointLight2ProjDesc.Location = vec3(-2.0f, 12.0f, 2.0f);
    //pointLight2ProjDesc.LookAt = vec3(0.0f, 0.0f, 0.0f);
    //pointLight2ProjDesc.Up = vec3(1.0f, 0.0f, 0.0f);
    //PointLightDesc light2Desc;
    //light2Desc.Intensity = vec3(50.0f, 20.0f, 10.0f);
    //mLightManager->CreatePointLight(&pointLight2ProjDesc, mMainCamera, &light2Desc);

    LightProjectorDesc spotLight1ProjDesc;
    spotLight1ProjDesc.UpFovDegrees = 90.0f;
    spotLight1ProjDesc.AspectRatio = 1.0f;
    spotLight1ProjDesc.NearPlane = 0.01f;
    spotLight1ProjDesc.FarPlane = 50.0f;
    spotLight1ProjDesc.Location = vec3(-0.5f, 10.0f, 0.0f);
    spotLight1ProjDesc.LookAt = vec3(-10.0f, 1.0f, 0.0f);
    spotLight1ProjDesc.Up = vec3(0.0f, 1.0f, 0.0f);
    SpotLightDesc spotLight1Desc;
    spotLight1Desc.Intensity = vec3(50.0f, 50.0f, 50.0f);
    spotLight1Desc.ConstantAttenuation = 0.0f;
    spotLight1Desc.QuadraticAttenuation = 0.2f;
    spotLight1Desc.CosCutoff = cos(40.0f / 180.0f * PI_SP);
    spotLight1Desc.InnerCosCutoff = cos(40.0f * 0.95f / 180.0f * PI_SP);
    spotLight1Desc.SpotExponent = 0.0f;
    mLightManager->CreateSpotLight(&spotLight1ProjDesc, mMainCamera, &spotLight1Desc);

    LightProjectorDesc spotLight2ProjDesc;
    spotLight2ProjDesc.UpFovDegrees = 90.0f;
    spotLight2ProjDesc.AspectRatio = 1.0f;
    spotLight2ProjDesc.NearPlane = 0.01f;
    spotLight2ProjDesc.FarPlane = 50.0f;
    spotLight2ProjDesc.Location = vec3(0.5f, 10.0f, 0.0f);
    spotLight2ProjDesc.LookAt = vec3(10.0f, 15.0f, -5.0f);
    spotLight2ProjDesc.Up = vec3(0.0f, 1.0f, 0.0f);
    SpotLightDesc spotLight2Desc;
    spotLight2Desc.Intensity = vec3(50.0f, 50.0f, 50.0f);
    spotLight2Desc.ConstantAttenuation = 0.0f;
    spotLight2Desc.QuadraticAttenuation = 0.2f;
    spotLight2Desc.CosCutoff = cos(40.0f / 180.0f * PI_SP);
    spotLight2Desc.InnerCosCutoff = cos(40.0f * 0.95f / 180.0f * PI_SP);
    spotLight2Desc.SpotExponent = 0.0f;
    mLightManager->CreateSpotLight(&spotLight2ProjDesc, mMainCamera, &spotLight2Desc);

    mLightManager->CreateLightBuffer(mDevice);

	// Create material templates.
	Material* material = 0;

    ShaderProgramInfo voxelizationProgramInfo;
    voxelizationProgramInfo.VShaderFileName = "VPLviaSVOGI/vVoxelization.glsl";
    voxelizationProgramInfo.GShaderFileName = "VPLviaSVOGI/gVoxelization.glsl";
    if( mVoxelizerType == Voxelizer::VT_Grid )
    {
        voxelizationProgramInfo.FShaderFileName = "VPLviaSVOGI/fVoxelization.glsl";
    }
    else if( mVoxelizerType == Voxelizer::VT_SVO )
    {
        voxelizationProgramInfo.FShaderFileName = "VPLviaSVOGI/fSVOVoxelization.glsl";
    }
    else
    {
        assert(false);
    }
    voxelizationProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                              ShaderType::ST_Geometry |
                                              ShaderType::ST_Fragment;
    Pass* passVoxelization = new Pass(voxelizationProgramInfo);

    ShaderProgramInfo pointLightShadowProgramInfo;
    pointLightShadowProgramInfo.VShaderFileName = "VPLviaSVOGI/vPointLightShadow.glsl";
    pointLightShadowProgramInfo.FShaderFileName = "VPLviaSVOGI/fPointLightShadow.glsl";
    pointLightShadowProgramInfo.TCShaderFileName = "VPLviaSVOGI/tcPointLightShadow.glsl";
    pointLightShadowProgramInfo.TEShaderFileName = "VPLviaSVOGI/tePointLightShadow.glsl";
    pointLightShadowProgramInfo.GShaderFileName = "VPLviaSVOGI/gPointLightShadow.glsl";
    pointLightShadowProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                                  ShaderType::ST_Fragment | 
                                                  ShaderType::ST_TessellationControl |
                                                  ShaderType::ST_TessellationEvaluation |
                                                  ShaderType::ST_Geometry;
    Pass* passPointLightShadow = new Pass(pointLightShadowProgramInfo);

    ShaderProgramInfo spotLightShadowProgramInfo;
    spotLightShadowProgramInfo.VShaderFileName = "VPLviaSVOGI/vSpotLightShadow.glsl";
    spotLightShadowProgramInfo.GShaderFileName = "VPLviaSVOGI/gSpotLightShadow.glsl";
    spotLightShadowProgramInfo.FShaderFileName = "VPLviaSVOGI/fSpotLightShadow.glsl";
    spotLightShadowProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                                 ShaderType::ST_Geometry |
                                                 ShaderType::ST_Fragment;
    Pass* passSpotLightShadow = new Pass(spotLightShadowProgramInfo);

    ShaderProgramInfo gbufferProgramInfo;
    if( mUseTC )
    {
        gbufferProgramInfo.VShaderFileName = "VPLviaSVOGI/vGBufferRPC.glsl";
        gbufferProgramInfo.FShaderFileName = "VPLviaSVOGI/fGBufferRPC.glsl";
    }
    else
    {
        gbufferProgramInfo.VShaderFileName = "VPLviaSVOGI/vGBuffer.glsl";
        gbufferProgramInfo.FShaderFileName = "VPLviaSVOGI/fGBuffer.glsl";
    }
    gbufferProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                         ShaderType::ST_Fragment;
    Pass* passGBuffer = new Pass(gbufferProgramInfo);

    ShaderProgramInfo pointLightRSMProgramInfo;
    pointLightRSMProgramInfo.VShaderFileName = "VPLviaSVOGI/vPointLightRSM.glsl";
    pointLightRSMProgramInfo.GShaderFileName = "VPLviaSVOGI/gPointLightRSM.glsl";
    pointLightRSMProgramInfo.FShaderFileName = "VPLviaSVOGI/fPointLightRSM.glsl";
    pointLightRSMProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                               ShaderType::ST_Geometry |
                                               ShaderType::ST_Fragment;
    pointLightRSMProgramInfo.Parameters.push_back(
        ShaderProgramParameterValue(SPP_Geometry_Vertices_Out, 
        RSM_FACE_COUNT * 3));
    Pass* passPointLightRSM = new Pass(pointLightRSMProgramInfo);

    ShaderProgramInfo spotLightRSMProgramInfo;
    spotLightRSMProgramInfo.VShaderFileName = "VPLviaSVOGI/vSpotLightRSM.glsl";
    spotLightRSMProgramInfo.GShaderFileName = "VPLviaSVOGI/gSpotLightRSM.glsl";
    spotLightRSMProgramInfo.FShaderFileName = "VPLviaSVOGI/fSpotLightRSM.glsl";
    spotLightRSMProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex |
                                              ShaderType::ST_Geometry |
                                              ShaderType::ST_Fragment;
    Pass* passSpotLightRSM = new Pass(spotLightRSMProgramInfo);

	Technique* techSceneModel = new Technique();
    techSceneModel->AddPass(passVoxelization);
    techSceneModel->AddPass(passPointLightShadow);
    techSceneModel->AddPass(passSpotLightShadow);
    techSceneModel->AddPass(passGBuffer);
    techSceneModel->AddPass(passPointLightRSM);
    techSceneModel->AddPass(passSpotLightRSM);
	MaterialTemplate* mtSceneModel = new MaterialTemplate();
    mtSceneModel->AddTechnique(techSceneModel);

    // Create scene.
    mat4 rotM;
    material = new Material(mtSceneModel);
    mModel = new SceneMesh(material, mMainCamera);
    mModel->LoadFromPLYFile("cube.ply");
    mModel->GenerateNormals();
    mModel->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-60.0f), vec3(0, 1, 0));
    mModel->SetWorldTransform(rotM);
    mModel->SetWorldTranslation(vec3(-6.0f, 2.5f, -1.5f));
    mModel->SetWorldScale(vec3(2.5f));
    mModel->MaterialColor = vec3(0.1f, 0.9f, 0.9f);
    mModel->SceneBB = &mSceneBB;
    mSceneBB.Merge(mModel->GetWorldSpaceBB());

    mModel2Sequence = new RenderSequence(0);
    for( int i = 1; i <= 12; ++i )
    {
        material = new Material(mtSceneModel);
        SceneMesh* model2 = new SceneMesh(material, mMainCamera);
        char objFileName[64];
        sprintf(objFileName, "elephant-gallop/elephant-gallop-%d.obj", i);
        model2->LoadFromOBJFile(objFileName);
        model2->GenerateNormals();
        model2->CreateDeviceResource(mDevice);
        rotM = rotate(mat4(), radians(-60.0f), vec3(0, 1, 0));
        model2->SetWorldTransform(rotM);
        model2->SetWorldTranslation(vec3(3.2f, 3.6f, 2.4f));
        model2->SetWorldScale(vec3(9.0f));
        model2->MaterialColor = vec3(0.2f, 0.2f, 0.9f);
        model2->SceneBB = &mSceneBB;
        model2->TessLevel = 1.0f;
        mSceneBB.Merge(model2->GetWorldSpaceBB());
        mModel2Sequence->AddRenderObject(model2);
    }
    mModel2Sequence->SetActiveRenderObject(0);
    mModel2Sequence->SetFrequence(0.4f);

    material = new Material(mtSceneModel);
    mGround = new SceneMesh(material, mMainCamera);
    mGround->LoadFromPLYFile("square.ply");
    mGround->GenerateNormals();
    mGround->CreateDeviceResource(mDevice);
    mGround->MaterialColor = vec3(1.0f, 1.0f, 1.0f);
    mGround->SceneBB = &mSceneBB;
    mSceneBB.Merge(mGround->GetWorldSpaceBB());

    material = new Material(mtSceneModel);
    mCeiling = new SceneMesh(material, mMainCamera);
    mCeiling->LoadFromPLYFile("square.ply");
    mCeiling->GenerateNormals();
    mCeiling->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(180.0f), vec3(1, 0, 0));
    mCeiling->SetWorldTransform(rotM);
    mCeiling->SetWorldTranslation(vec3(0.0f, 20.0f, 0.0f));
    mCeiling->MaterialColor = vec3(1.0f, 1.0f, 1.0f);
    mCeiling->SceneBB = &mSceneBB;
    mSceneBB.Merge(mCeiling->GetWorldSpaceBB());

    material = new Material(mtSceneModel);
    mBackWall = new SceneMesh(material, mMainCamera);
    mBackWall->LoadFromPLYFile("square.ply");
    mBackWall->GenerateNormals();
    mBackWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(1, 0, 0));
    mBackWall->SetWorldTransform(rotM);
    mBackWall->SetWorldTranslation(vec3(0.0f, 10.0f, -10.0f));
    mBackWall->MaterialColor = vec3(1.0f, 1.0f, 1.0f);
    mBackWall->SceneBB = &mSceneBB;
    mSceneBB.Merge(mBackWall->GetWorldSpaceBB());

    material = new Material(mtSceneModel);
    mLeftWall = new SceneMesh(material, mMainCamera);
    mLeftWall->LoadFromPLYFile("square.ply");
    mLeftWall->GenerateNormals();
    mLeftWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-90.0f), vec3(0, 0, 1));
    mLeftWall->SetWorldTransform(rotM);
    mLeftWall->SetWorldTranslation(vec3(-10.0f, 10.0f, 0.0f));
    mLeftWall->MaterialColor = vec3(0.95f, 0.2f, 0.2f);
    mLeftWall->SceneBB = &mSceneBB;
    mSceneBB.Merge(mLeftWall->GetWorldSpaceBB());

    material = new Material(mtSceneModel);
    mRightWall = new SceneMesh(material, mMainCamera);
    mRightWall->LoadFromPLYFile("square.ply");
    mRightWall->GenerateNormals();
    mRightWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(0, 0, 1));
    mRightWall->SetWorldTransform(rotM);
    mRightWall->SetWorldTranslation(vec3(10.0f, 10.0f, 0.0f));
    mRightWall->MaterialColor = vec3(0.2f, 0.95f, 0.2f);
    mRightWall->SceneBB = &mSceneBB;
    mSceneBB.Merge(mRightWall->GetWorldSpaceBB());

    // Create scene renderset.
    mSceneObjects = new RenderSet();
    mSceneObjects->AddRenderObject(mModel);
    mSceneObjects->AddRenderObject(mModel2Sequence);
    mSceneObjects->AddRenderObject(mGround);
    mSceneObjects->AddRenderObject(mCeiling);
    mSceneObjects->AddRenderObject(mBackWall);
    mSceneObjects->AddRenderObject(mLeftWall);
    mSceneObjects->AddRenderObject(mRightWall);
    mSceneObjects->UpdateRenderCache();

    // Create shadow casters.
    mShadowCasters = new RenderSet();
    mShadowCasters->AddRenderObject(mModel);
    mShadowCasters->AddRenderObject(mModel2Sequence);
    mShadowCasters->AddRenderObject(mGround);
    mShadowCasters->AddRenderObject(mCeiling);
    mShadowCasters->AddRenderObject(mBackWall);
    mShadowCasters->AddRenderObject(mLeftWall);
    mShadowCasters->AddRenderObject(mRightWall);

    // Create voxelizer renderset.
    mVoxelizedObjects = new RenderSet();
    if( mVoxelizerType == Voxelizer::VT_Grid )
    {
        mVoxelizedObjects->AddRenderObject(mModel);
        mVoxelizedObjects->AddRenderObject(mModel2Sequence);
        mVoxelizedObjects->AddRenderObject(mGround);
        mVoxelizedObjects->AddRenderObject(mCeiling);
        mVoxelizedObjects->AddRenderObject(mBackWall);
        mVoxelizedObjects->AddRenderObject(mLeftWall);
        mVoxelizedObjects->AddRenderObject(mRightWall);
    }
    else if( mVoxelizerType == Voxelizer::VT_SVO )
    {
        mVoxelizedObjects->AddRenderObject(mModel);
        mVoxelizedObjects->AddRenderObject(mModel2Sequence);
    }
    else
    {
        assert(false);
    }

    // Create scene voxelizer.
    if( mVoxelizerType == Voxelizer::VT_Grid )
    {
        mVoxelizer = new GridVoxelizer(mDevice);
        ((GridVoxelizer*)(Voxelizer*)mVoxelizer)->Initialize(mDevice, 
            VOXEL_DIMENSION, VOXEL_LOCAL_GROUP_DIM, &mSceneBB);
    }
    else if( mVoxelizerType == Voxelizer::VT_SVO )
    {
        mVoxelizer = new SVOVoxelizer(mDevice);
        ((SVOVoxelizer*)(Voxelizer*)mVoxelizer)->Initialize(mDevice, 
            VOXEL_DIMENSION, &mSceneBB);
    }
    else
    {
        assert(false);
    }
    mVoxelizer->RasterizerDimBias = -1;
    mVoxelizer->SetRenderSet(mVoxelizedObjects);

    // Create G-buffer renderer.
    GBufferDesc gbufferDesc;
    gbufferDesc.Width = Width;
    gbufferDesc.Height = Height;
    gbufferDesc.PositionFormat = BF_RGBAF;
    gbufferDesc.NormalFormat = BF_RGBAF;
    gbufferDesc.AlbedoFormat = BF_RGBAF;
    gbufferDesc.RPCFormat = BF_RGBAF;
    mGBufferRenderer = new GBufferRenderer(mDevice);
    mGBufferRenderer->CreateGBuffer(&gbufferDesc);
    mGBufferRenderer->SetRenderSet(mSceneObjects);

    // Create shadow map renderer.
    mShadowMapRenderer = new ShadowMapsGenerator(mDevice);
    mShadowMapRenderer->Initialize(1024, 1024, BF_R32F, mLightManager);
    mShadowMapRenderer->SetRenderSet(mShadowCasters);

    // Create RSM renderer.
    mRSMRenderer = new RSMRenderer(mDevice);
    mRSMRenderer->Initialize(256, 256, BF_RGBAF, mLightManager);
    mRSMRenderer->SetRenderSet(mSceneObjects);

    // Create VPL generator.
    mVPLGenerator = new VPLGenerator(mDevice);
    mVPLGenerator->SetRSMRenderer(mRSMRenderer);
    mVPLGenerator->Initialize(mDevice, VPL_SAMPLE_COUNT);

    // Create direct lighting renderer.
    mDirectLightingRenderer = new DirectLightingRenderer(mDevice);
    mDirectLightingRenderer->Initialize(mDevice, Width, Height, BF_RGBAF, 
        mGBufferRenderer, mShadowMapRenderer);

    // Create indirect lighting renderer.
    mIndirectLightingRenderer = new IndirectLightingRenderer(mDevice);
    mIndirectLightingRenderer->Initialize(mDevice, Width, Height, BF_RGBAF, 
        VPL_SAMPLE_COUNT, INTERLEAVED_PATTERN_SIZE, &mSceneBB, VOXEL_DIMENSION, 
        mGBufferRenderer, mVPLGenerator, mVoxelizer, mUseTC);

    // Create visualizer.
    mVisualizer = new Visualizer(mDevice);
    mVisualizer->Initialize(mDevice, mVoxelizer, mVPLGenerator, 
        mShadowMapRenderer, mGBufferRenderer, mRSMRenderer, 
        mDirectLightingRenderer, mIndirectLightingRenderer, &mSceneBB, 
        VOXEL_DIMENSION, VOXEL_LOCAL_GROUP_DIM, mMainCamera, 
        INTERLEAVED_PATTERN_SIZE, VPL_SAMPLE_COUNT);

    // Create GPU timer.
    mTimer = new GPUTimer();
    mTimer->CreateDeviceResource();
    mVoxelizer->SetTimer(mTimer);
    mShadowMapRenderer->SetTimer(mTimer);
    mGBufferRenderer->SetTimer(mTimer);
    mRSMRenderer->SetTimer(mTimer);
    mVPLGenerator->SetTimer(mTimer);
    mDirectLightingRenderer->SetTimer(mTimer);
    mIndirectLightingRenderer->SetTimer(mTimer);
    mVisualizer->SetTimer(mTimer);

	// Create information panel.
	int screenX, screenY;
	glfwGetWindowPos(Window, &screenX, &screenY);
	InformationPanel^ infoPanel = gcnew InformationPanel();
	infoPanel->Show();
	infoPanel->SetDesktopLocation(screenX + Width + 12, screenY - 30);

    // Create GUI elements.

    InformationPanel::GetInstance()->AddListener(this);

    int infoStartY = 20;
    int infoIncY = 20;
#ifdef SHOW_TIMING
    InformationPanel::GetInstance()->AddTimingLabel("Scene Voxelization Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Scene Shadow Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Scene G-buffer Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("RSM Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("VPL Creation Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Direct Lighting Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Indirect Lighting Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Visualizer Pass", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Total", 16, infoStartY);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddTimingLabel("Frame Counter", 16, infoStartY);
#endif

    infoStartY = 20;
    InformationPanel::GetInstance()->AddRadioButton("Voxel Buffer", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    if( mVoxelizerType == Voxelizer::VT_Grid )
    {
        InformationPanel::GetInstance()->AddRadioButton("Voxel Grid", 16, infoStartY, 60, 20, false);
    }
    else if( mVoxelizerType == Voxelizer::VT_SVO )
    {
        InformationPanel::GetInstance()->AddRadioButton("SVO Grid", 16, infoStartY, 60, 20, false);
    }
    else
    {
        assert(false);
    }
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("Scene Shadow Map", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddButton("Prev Shadow Map", 30, infoStartY, 110, 24);
    InformationPanel::GetInstance()->AddButton("Next Shadow Map", 145, infoStartY, 110, 24);
    infoStartY += infoIncY + 5;
    InformationPanel::GetInstance()->AddRadioButton("G-Buffer Position", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("G-Buffer Normal", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("G-Buffer Albedo", 16, infoStartY, 60, 20, false);
    if( mUseTC )
    {
        infoStartY += infoIncY;
        InformationPanel::GetInstance()->AddRadioButton("G-Buffer RPC", 16, infoStartY, 60, 20, false);
    }
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("RSM Position", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("RSM Normal", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("RSM Flux", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("Direct Lighting", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("Indirect Lighting", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("Filtered Indirect Lighting", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddRadioButton("Final Result", 16, infoStartY, 60, 20, true);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("Enable Rotation", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("Show Direct Shadow", 16, infoStartY, 60, 20, true);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("VPL Visibility Test", 16, infoStartY, 60, 20, true);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("Show VPL", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("Show VPL Interleaved Sampling Subset", 16, infoStartY, 60, 20, false);
    infoStartY += infoIncY;
    InformationPanel::GetInstance()->AddCheckBox("Show VPL Flux Contrast", 16, infoStartY, 60, 20, false);
    infoStartY += 24;
    InformationPanel::GetInstance()->AddButton("Prev VPL Subset", 16, infoStartY, 100, 24);
    InformationPanel::GetInstance()->AddButton("Next VPL Subset", 120, infoStartY, 100, 24);
}
示例#5
0
//----------------------------------------------------------------------------
void RayBundleApp::Initialize(GPUDevice* device)
{
	GLboolean supportNVAtomicFloatOp = QueryExtension("GL_NV_shader_atomic_float");
	assert( supportNVAtomicFloatOp );

	float color = 0.0f;
	glClearColor(color, color, color, 0.0f);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    //glEnable(GL_DEPTH_TEST);
	glDisable(GL_DEPTH_TEST);
    //glEnable(GL_CULL_FACE);
	glDisable(GL_CULL_FACE);

	// Create ray-bundle projector.
	mRayBundleProjector = new Camera(false);
	mRayBundleProjector->SetOrthogonalFrustum(11.0f, 
		(float)mRayBundleRTWidth/(float)mRayBundleRTHeight, 1.0f, 100.0f);
	mRayBundleProjector->SetLookAt(vec3(0.0f, -4.15f, 0.0f), sphereCenter,
		vec3(0.0f, 0.0f, 1.0f));
    
    // Create scene camera.
	mMainCamera->SetPerspectiveFrustum(45.0f, (float)Width/(float)Height, 1.0f, 50.0f);
	mMainCamera->SetLookAt(vec3(0.0f, 10.0f, 35.0f), vec3(0.0f, 10.0f, 0.0f),
        vec3(0.0f, 1.0f, 0.0f));

	// Create material templates.
	Material* material = 0;

    ShaderProgramInfo sceneProgramInfo;
    sceneProgramInfo.VShaderFileName = "RayBundle/vScene.glsl";
    sceneProgramInfo.FShaderFileName = "RayBundle/fScene.glsl";
    sceneProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex | ShaderType::ST_Fragment;
    Pass* passScene = new Pass(sceneProgramInfo);
    ShaderProgramInfo rayBundleProgramInfo;
    rayBundleProgramInfo.VShaderFileName = "RayBundle/vRayBundle.glsl";
    rayBundleProgramInfo.FShaderFileName = "RayBundle/fRayBundle.glsl";
    rayBundleProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex | ShaderType::ST_Fragment;
    Pass* passRayBundle = new Pass(rayBundleProgramInfo);
	Technique* techRayBundle = new Technique();
	techRayBundle->AddPass(passScene);
	techRayBundle->AddPass(passRayBundle);
	MaterialTemplate* mtRayBundle = new MaterialTemplate();
	mtRayBundle->AddTechnique(techRayBundle);

    ShaderProgramInfo updateAccumulationProgramInfo;
    updateAccumulationProgramInfo.VShaderFileName = "RayBundle/vUpdateAccumulation.glsl";
    updateAccumulationProgramInfo.FShaderFileName = "RayBundle/fUpdateAccumulation.glsl";
    updateAccumulationProgramInfo.ShaderStageFlag = ShaderType::ST_Vertex | ShaderType::ST_Fragment;
    Pass* passUpdateAccumulation = new Pass(updateAccumulationProgramInfo);
	Technique* techUpdateAccumulation = new Technique();
	techUpdateAccumulation->AddPass(passUpdateAccumulation);
	MaterialTemplate* mtUpdateAccumulation = new MaterialTemplate();
	mtUpdateAccumulation->AddTechnique(techUpdateAccumulation);

	// Create scene.
	mat4 rotM;
	material = new Material(mtRayBundle);
	mModel = new RayBundleTriMesh(material, mMainCamera);
	mModel->LoadFromPLYFile("beethoven.ply");
	mModel->GenerateNormals();
	mModel->CreateDeviceResource(mDevice);
	mModel->SetWorldTranslation(vec3(-2.0f, 5.8f, -1.0f));
	mModel->MaterialColor = vec3(0.65f, 0.65f, 0.65f);
	mSceneBB.Merge(mModel->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mGround = new RayBundleTriMesh(material, mMainCamera);
	mGround->LoadFromPLYFile("square.ply");
	mGround->GenerateNormals();
	mGround->CreateDeviceResource(mDevice);
    mGround->MaterialColor = vec3(0.5f, 0.0f, 0.0f);
	mSceneBB.Merge(mGround->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mCeiling = new RayBundleTriMesh(material, mMainCamera);
	mCeiling->LoadFromPLYFile("square.ply");
	mCeiling->GenerateNormals();
	mCeiling->CreateDeviceResource(mDevice);
	rotM = rotate(mat4(), radians(180.0f), vec3(1, 0, 0));
	mCeiling->SetWorldTransform(rotM);
	mCeiling->SetWorldTranslation(vec3(0.0f, 20.0f, 0.0f));
    mCeiling->MaterialColor = vec3(0.0f, 0.0f, 0.75f);
	mSceneBB.Merge(mCeiling->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mLight = new RayBundleTriMesh(material, mMainCamera);
	mLight->LoadFromPLYFile("square.ply");
	mLight->GenerateNormals();
	mLight->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(180.0f), vec3(1, 0, 0));
	mLight->SetWorldTransform(rotM);
	mLight->SetWorldScale(vec3(0.5f));
	mLight->SetWorldTranslation(vec3(0.0f, 19.0f, 3.0f));
	mLight->EmissionColor = vec3(1000.0f, 1000.0f, 1000.0f);
	mLight->MaterialColor = vec3(0.0f, 0.0f, 0.0f);
	mLight->IsLight = true;
	mSceneBB.Merge(mLight->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mBackWall = new RayBundleTriMesh(material, mMainCamera);
	mBackWall->LoadFromPLYFile("square.ply");
	mBackWall->GenerateNormals();
	mBackWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(1, 0, 0));
	mBackWall->SetWorldTransform(rotM);
	mBackWall->SetWorldTranslation(vec3(0.0f, 10.0f, -10.0f));
    mBackWall->MaterialColor = vec3(0.75f, 0.75f, 0.75f);
	mSceneBB.Merge(mBackWall->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mLeftWall = new RayBundleTriMesh(material, mMainCamera);
	mLeftWall->LoadFromPLYFile("square.ply");
	mLeftWall->GenerateNormals();
	mLeftWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(-90.0f), vec3(0, 0, 1));
	mLeftWall->SetWorldTransform(rotM);
	mLeftWall->SetWorldTranslation(vec3(-10.0f, 10.0f, 0.0f));
    mLeftWall->MaterialColor = vec3(1.0f, 0.0f, 0.0f);
	mSceneBB.Merge(mLeftWall->GetWorldSpaceBB());

	material = new Material(mtRayBundle);
	mRightWall = new RayBundleTriMesh(material, mMainCamera);
	mRightWall->LoadFromPLYFile("square.ply");
	mRightWall->GenerateNormals();
	mRightWall->CreateDeviceResource(mDevice);
    rotM = rotate(mat4(), radians(90.0f), vec3(0, 0, 1));
	mRightWall->SetWorldTransform(rotM);
	mRightWall->SetWorldTranslation(vec3(10.0f, 10.0f, 0.0f));
    mRightWall->MaterialColor = vec3(0.0f, 1.0f, 0.0f);
	mSceneBB.Merge(mRightWall->GetWorldSpaceBB());

	mVoxelGridCenter = mSceneBB.GetBoxCenter();

	int pixelCount = 0;
	void* pixelBufferData = 0;
	size_t gpuMemPoolSize = 0;

	// Create ray head pointer texture.
	mRayHeadPointerTexture = new Texture2D();
	mRayHeadPointerTexture->CreateRenderTarget(mDevice, mRayBundleRTWidth, 
        mRayBundleRTHeight, BF_R32UI);

	// Create ray head pointer texture init data.
	pixelCount = mRayBundleRTWidth * mRayBundleRTHeight;
	mRayHeadPointerTextureInitData = new PixelBuffer();
	mRayHeadPointerTextureInitData->ReserveMutableDeviceResource(mDevice,
		pixelCount*sizeof(GLuint), BU_Static_Draw);
	mRayHeadPointerTextureInitData->Bind();
	pixelBufferData = mRayHeadPointerTextureInitData->Map(BA_Write_Only);
	assert( pixelBufferData );
	memset(pixelBufferData, 0x00, pixelCount*sizeof(GLuint));
	mRayHeadPointerTextureInitData->Unmap();

	// Create per-voxel mutex texture.
	int voxelMutexCount = mVoxelCount;
	mPerVoxelMutexTexture = new Texture1D();
	mPerVoxelMutexTexture->LoadFromSystemMemory(mDevice, BIF_R32UI, voxelMutexCount, 
        BF_R32UI, BCT_Unsigned_Byte, 0);

	// Create per-voxel mutex texture init data.
	mPerVoxelMutexTextureInitData = new PixelBuffer();
	mPerVoxelMutexTextureInitData->ReserveMutableDeviceResource(mDevice, 
        voxelMutexCount*sizeof(GLuint), BU_Static_Draw);
	mPerVoxelMutexTextureInitData->Bind();
	pixelBufferData = mPerVoxelMutexTextureInitData->Map(BA_Write_Only);
	assert( pixelBufferData );
	memset(pixelBufferData, 0x00, voxelMutexCount*sizeof(GLuint));
	mPerVoxelMutexTextureInitData->Unmap();

	// Create ray GPU memory allocator counter.
	mRayAllocCounter = new AtomicCounterBuffer();
	mRayAllocCounter->ReserveMutableDeviceResource(mDevice, sizeof(GLuint),
        BU_Dynamic_Copy);

	// Create ray GPU memory pool for concurrent linked lists.
	gpuMemPoolSize = 8 * pixelCount * (4*sizeof(vec4) + sizeof(GLuint) + 
		sizeof(GLfloat) + sizeof(GLboolean));
	mRayBundleNodeBuffer = new StructuredBuffer();
    mRayBundleNodeBuffer->ReserveMutableDeviceResource(mDevice, gpuMemPoolSize, BU_Dynamic_Copy);

	// Create accumulation buffer.
	size_t bufferSize = mVoxelCount * sizeof(vec4);
	mAccumulationBuffer = new StructuredBuffer();
    mAccumulationBuffer->ReserveMutableDeviceResource(mDevice, bufferSize, BU_Dynamic_Copy);

	// Create ray-bundle render target.
	mRayBundleRT = new Texture2D();
	mRayBundleRT->CreateRenderTarget(mDevice, mRayBundleRTWidth, mRayBundleRTHeight, BF_RGBF);
	mRayBundleDepth = new Texture2D();
	mRayBundleDepth->CreateRenderTarget(mDevice, mRayBundleRTWidth, mRayBundleRTHeight, BF_Depth);

	Texture* rayBundleRT[1] = {mRayBundleRT};
	mRayBundleFB = new FrameBuffer(mDevice);
	mRayBundleFB->SetRenderTargets(1, rayBundleRT, mRayBundleDepth);

	// Create update accumulation screen quad.
	material = new Material(mtUpdateAccumulation);
	mUpdateAccuScreenQuad = new UpdateAccumulationScreenQuad(material);
	mUpdateAccuScreenQuad->LoadFromPLYFile("screenquad.ply");
	mUpdateAccuScreenQuad->SetTCoord(0, vec2(0.0f, 0.0f));
	mUpdateAccuScreenQuad->SetTCoord(1, vec2(1.0f, 0.0f));
	mUpdateAccuScreenQuad->SetTCoord(2, vec2(1.0f, 1.0f));
	mUpdateAccuScreenQuad->SetTCoord(3, vec2(0.0f, 1.0f));
	mUpdateAccuScreenQuad->CreateDeviceResource(mDevice);

	for( int i = 0; i < RAYBUNDLE_SAMPLE_COUNT; ++i )
	{
		float u1 = (float)UniformRandom();
		float u2 = (float)UniformRandom();
		mRandmoDirections[i] = UniformSampleSphere(u1, u2);
	}
}