ConeTracePass::ConeTracePass(VCTscene* vctScene){ using namespace kore; _name = std::string("ConeTrace"); _useGPUProfiling = vctScene->getUseGPUprofiling(); _vctScene = vctScene; _renderMgr = RenderManager::getInstance(); _sceneMgr = SceneManager::getInstance(); _resMgr = ResourceManager::getInstance(); _coneTraceShader.loadShader("./assets/shader/VoxelConeTracing/raycastVert.shader", GL_VERTEX_SHADER); _coneTraceShader.loadShader("./assets/shader/ConeTraceFrag.shader", GL_FRAGMENT_SHADER, std::string("#define LEAF_NODE_RESOLUTION ") + std::to_string(vctScene->getNodePool()->getLeafNodeResolution()) + std::string("\n\n") ); _coneTraceShader.setName("cone trace shader"); _coneTraceShader.init(); _coneTraceShader.startUniformBindingCheck(); this->setShaderProgram(&_coneTraceShader); TexSamplerProperties samplerProps; samplerProps.minfilter = GL_LINEAR; samplerProps.magfilter = GL_LINEAR; samplerProps.wrapping = glm::uvec3(GL_REPEAT, GL_REPEAT, GL_REPEAT); _coneTraceShader.setSamplerProperties(0, samplerProps); SceneNode* fsquadnode = new SceneNode(); SceneManager::getInstance()->getRootNode()->addChild(fsquadnode); MeshComponent* fsqMeshComponent = new MeshComponent(); fsqMeshComponent->setMesh(FullscreenQuad::getInstance()); fsquadnode->addComponent(fsqMeshComponent); kore::Camera* cam = vctScene->getCamera(); NodePass* nodePass = new NodePass(fsquadnode); this->addNodePass(nodePass); glm::ivec4 vp(0, 0, RenderManager::getInstance()->getScreenResolution().x, RenderManager::getInstance()->getScreenResolution().y); nodePass->addOperation(new ViewportOp(vp)); nodePass ->addOperation(new ColorMaskOp(glm::bvec4(true, true, true, true))); nodePass->addOperation(OperationFactory::create(OP_BINDATTRIBUTE, "v_position", fsqMeshComponent, "v_position", &_coneTraceShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "ratio", cam, "fRatio", &_coneTraceShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "FOV degree", cam, "fYfovDeg", &_coneTraceShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "far Plane", cam, "fFar", &_coneTraceShader)); nodePass->addOperation(new BindUniform(_renderMgr->getShdScreenRes(), _coneTraceShader.getUniform("screenRes"))); addStartupOperation(new BindImageTexture( vctScene->getNodePool()->getShdNodePool(NEXT), _coneTraceShader.getUniform("nodePool_next"), GL_READ_ONLY)); addStartupOperation(new BindImageTexture( vctScene->getNodePool()->getShdNodePool(COLOR), _coneTraceShader.getUniform("nodePool_color"), GL_READ_ONLY)); addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_COLOR), _coneTraceShader.getUniform("brickPool_color"))); addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_IRRADIANCE), _coneTraceShader.getUniform("brickPool_irradiance"))); addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_NORMAL), _coneTraceShader.getUniform("brickPool_normal"))); nodePass->addOperation(new BindUniform( vctScene->getShdVoxelGridResolution(), _coneTraceShader.getUniform("voxelGridResolution"))); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "inverse view Matrix", cam, "viewI", &_coneTraceShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "inverse model Matrix", vctScene->getVoxelGridNode()->getTransform(), "voxelGridTransformI", &_coneTraceShader)); nodePass->addOperation(new BindUniform(vctScene->getNodePool()->getShdNumLevels(), _coneTraceShader.getUniform("numLevels"))); nodePass->addOperation(new BindUniform(vctScene->getNodePool()->getShdLeafNodeResolution(), _coneTraceShader.getUniform("leafNodeResolution"))); nodePass->addOperation(new BindUniform(&vctScene->_shdConeDiameter, _coneTraceShader.getUniform("coneAngle"))); ////////////////////////////////////////////////////////////////////////// // Tweak-Parameters nodePass->addOperation(new BindUniform(vctScene->getShdUseLighting(), _coneTraceShader.getUniform("useLighting"))); //nodePass->addOperation(new BindUniform(&vctScene->_shdUseAlphaCorrection, _coneTraceShader.getUniform("useAlphaCorrection"))); ////////////////////////////////////////////////////////////////////////// nodePass->addOperation(new RenderMesh(fsqMeshComponent)); _coneTraceShader.finishUniformBindingCheck(); }
RayCastingPass::RayCastingPass(VCTscene* vctScene) { using namespace kore; _name = std::string("Raycasting Pass"); _useGPUProfiling = vctScene->getUseGPUprofiling(); _raycastShader .loadShader("./assets/shader/VoxelConeTracing/raycastVert.shader", GL_VERTEX_SHADER); _raycastShader. loadShader("./assets/shader/VoxelConeTracing/raycastFrag.shader", GL_FRAGMENT_SHADER); _raycastShader.setName("raycastShader"); _raycastShader.init(); this->setShaderProgram(&_raycastShader); SceneNode* fsquadnode = new SceneNode(); SceneManager::getInstance()->getRootNode()->addChild(fsquadnode); MeshComponent* fsqMeshComponent = new MeshComponent(); fsqMeshComponent->setMesh(FullscreenQuad::getInstance()); fsquadnode->addComponent(fsqMeshComponent); kore::Camera* cam = vctScene->getCamera(); NodePass* nodePass = new NodePass(fsquadnode); this->addNodePass(nodePass); glm::ivec4 vp(0, 0, RenderManager::getInstance()->getScreenResolution().x, RenderManager::getInstance()->getScreenResolution().y); nodePass->addOperation(new ViewportOp(vp)); nodePass ->addOperation(new EnableDisableOp(GL_DEPTH_TEST, EnableDisableOp::DISABLE)); nodePass ->addOperation(new ColorMaskOp(glm::bvec4(true, true, true, true))); nodePass->addOperation(OperationFactory::create(OP_BINDATTRIBUTE, "v_position", fsqMeshComponent, "v_position", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "ratio", cam, "fRatio", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "FOV degree", cam, "fYfovDeg", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "far Plane", cam, "fFar", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "inverse view Matrix", cam, "viewI", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "model Matrix", vctScene->getVoxelGridNode()->getTransform(), "voxelGridTransform", &_raycastShader)); nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, "inverse model Matrix", vctScene->getVoxelGridNode()->getTransform(), "voxelGridTransformI", &_raycastShader)); nodePass->addOperation(new RenderMesh(fsqMeshComponent)); }