void GLSBVR::SetBrickDepShaderVars(const Brick& currentBrick) { FLOATVECTOR3 vVoxelSizeTexSpace; if (m_bUseOnlyPowerOfTwo) { UINTVECTOR3 vP2VoxelCount(MathTools::NextPow2(currentBrick.vVoxelCount.x), MathTools::NextPow2(currentBrick.vVoxelCount.y), MathTools::NextPow2(currentBrick.vVoxelCount.z)); vVoxelSizeTexSpace = 1.0f/FLOATVECTOR3(vP2VoxelCount); } else { vVoxelSizeTexSpace = 1.0f/FLOATVECTOR3(currentBrick.vVoxelCount); } float fStepScale = m_SBVRGeogen.GetOpacityCorrection(); GLSLProgram *shader; switch (m_eRenderMode) { case RM_1DTRANS: { shader = (m_SBVRGeogen.HasMesh() ? (m_pProgram1DTransMesh[m_bUseLighting ? 1 : 0]) : (m_pProgram1DTrans[m_bUseLighting ? 1 : 0])); shader->Enable(); shader->Set("fStepScale", fStepScale); if (m_bUseLighting) { shader->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z); } break; } case RM_2DTRANS: { shader = (m_SBVRGeogen.HasMesh() ? (m_pProgram2DTransMesh[m_bUseLighting ? 1 : 0]) : (m_pProgram2DTrans[m_bUseLighting ? 1 : 0])); shader->Enable(); shader->Set("fStepScale", fStepScale); shader->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z); break; } case RM_ISOSURFACE: { shader = this->ColorData() ? m_pProgramColor : m_pProgramIso; shader->Enable(); shader->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z); break; } default: T_ERROR("Invalid rendermode set"); break; } }
void GLRaycaster::StartFrame() { GLGPURayTraverser::StartFrame(); FLOATVECTOR2 vfWinSize = FLOATVECTOR2(m_vWinSize); switch (m_eRenderMode) { case RM_1DTRANS : m_pProgram1DTrans[0]->Enable(); m_pProgram1DTrans[0]->Set("vScreensize",vfWinSize.x, vfWinSize.y); m_pProgram1DTrans[1]->Enable(); m_pProgram1DTrans[1]->Set("vScreensize",vfWinSize.x, vfWinSize.y); break; case RM_2DTRANS : m_pProgram2DTrans[0]->Enable(); m_pProgram2DTrans[0]->Set("vScreensize",vfWinSize.x, vfWinSize.y); m_pProgram2DTrans[1]->Enable(); m_pProgram2DTrans[1]->Set("vScreensize",vfWinSize.x, vfWinSize.y); break; case RM_ISOSURFACE : { FLOATVECTOR3 scale = 1.0f/FLOATVECTOR3(m_pDataset->GetScale()); if (m_bDoClearView) { m_pProgramIso2->Enable(); m_pProgramIso2->Set("vScreensize",vfWinSize.x, vfWinSize.y); m_pProgramIso2->Set("vDomainScale",scale.x,scale.y,scale.z); } GLSLProgram* shader = this->ColorData() ? m_pProgramColor : m_pProgramIso; shader->Enable(); shader->Set("vScreensize",vfWinSize.x, vfWinSize.y); shader->Set("vDomainScale",scale.x,scale.y,scale.z); } break; default : T_ERROR("Invalid rendermode set"); break; } }
void GLRaycaster::SetBrickDepShaderVars(const RenderRegion3D&, const Brick& currentBrick, size_t iCurrentBrick) { FLOATVECTOR3 vVoxelSizeTexSpace; if (m_bUseOnlyPowerOfTwo) { UINTVECTOR3 vP2VoxelCount(MathTools::NextPow2(currentBrick.vVoxelCount.x), MathTools::NextPow2(currentBrick.vVoxelCount.y), MathTools::NextPow2(currentBrick.vVoxelCount.z)); vVoxelSizeTexSpace = 1.0f/FLOATVECTOR3(vP2VoxelCount); } else { vVoxelSizeTexSpace = 1.0f/FLOATVECTOR3(currentBrick.vVoxelCount); } float fSampleRateModifier = m_fSampleRateModifier / (this->decreaseSamplingRateNow ? m_fSampleDecFactor : 1.0f); float fRayStep = (currentBrick.vExtension*vVoxelSizeTexSpace * 0.5f * 1.0f/fSampleRateModifier).minVal(); float fStepScale = 1.0f/fSampleRateModifier * (FLOATVECTOR3(m_pDataset->GetDomainSize())/FLOATVECTOR3(m_pDataset->GetDomainSize(static_cast<size_t>(m_iCurrentLOD)))).maxVal(); switch (m_eRenderMode) { case RM_1DTRANS : { m_pProgram1DTrans[m_bUseLighting ? 1 : 0]->Set("fStepScale", fStepScale); m_pProgram1DTrans[m_bUseLighting ? 1 : 0]->Set("fRayStepsize", fRayStep); if (m_bUseLighting) m_pProgram1DTrans[1]->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z ); break; } case RM_2DTRANS : { m_pProgram2DTrans[m_bUseLighting ? 1 : 0]->Set("fStepScale", fStepScale); m_pProgram2DTrans[m_bUseLighting ? 1 : 0]->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z ); m_pProgram2DTrans[m_bUseLighting ? 1 : 0]->Set("fRayStepsize", fRayStep); break; } case RM_ISOSURFACE : { GLSLProgram* shader = this->ColorData() ? m_pProgramColor : m_pProgramIso; if (m_bDoClearView) { m_pProgramIso2->Enable(); m_pProgramIso2->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z ); m_pProgramIso2->Set("fRayStepsize", fRayStep); m_pProgramIso2->Set("iTileID", int(iCurrentBrick)); shader->Enable(); shader->Set("iTileID", int(iCurrentBrick)); } shader->Set("vVoxelStepsize", vVoxelSizeTexSpace.x, vVoxelSizeTexSpace.y, vVoxelSizeTexSpace.z ); shader->Set("fRayStepsize", fRayStep); break; } case RM_INVALID: T_ERROR("Invalid rendermode set"); break; } }
void GLSBVR::Render3DInLoop(const RenderRegion3D& renderRegion, size_t iCurrentBrick, EStereoID eStereoID) { m_pContext->GetStateManager()->Apply(m_BaseState); const Brick& b = (eStereoID == SI_LEFT_OR_MONO) ? m_vCurrentBrickList[iCurrentBrick] : m_vLeftEyeBrickList[iCurrentBrick]; if (m_iBricksRenderedInThisSubFrame == 0 && m_eRenderMode == RM_ISOSURFACE){ m_TargetBinder.Bind(m_pFBOIsoHit[size_t(eStereoID)], 0, m_pFBOIsoHit[size_t(eStereoID)], 1); GL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); if (m_bDoClearView) { m_TargetBinder.Bind(m_pFBOCVHit[size_t(eStereoID)], 0, m_pFBOCVHit[size_t(eStereoID)], 1); GL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); } } if (!m_bSupportsMeshes && b.bIsEmpty) return; // setup the slice generator m_SBVRGeogen.SetBrickData(b.vExtension, b.vVoxelCount, b.vTexcoordsMin, b.vTexcoordsMax); FLOATMATRIX4 maBricktTrans; maBricktTrans.Translation(b.vCenter.x, b.vCenter.y, b.vCenter.z); m_mProjection[size_t(eStereoID)].setProjection(); renderRegion.modelView[size_t(eStereoID)].setModelview(); m_SBVRGeogen.SetBrickTrans(b.vCenter); m_SBVRGeogen.SetWorld(renderRegion.rotation*renderRegion.translation); m_SBVRGeogen.SetView(m_mView[size_t(eStereoID)]); if (m_bSupportsMeshes) { m_SBVRGeogen.ResetMesh(); if (m_eRenderMode != RM_ISOSURFACE) { for (vector<shared_ptr<RenderMesh>>::iterator mesh = m_Meshes.begin(); mesh != m_Meshes.end(); mesh++) { if ((*mesh)->GetActive()) { m_SBVRGeogen.AddMesh((*mesh)->GetInPointList(false)); } } } } m_SBVRGeogen.ComputeGeometry(b.bIsEmpty); if (m_eRenderMode == RM_ISOSURFACE) { m_pContext->GetStateManager()->SetEnableBlend(false); m_TargetBinder.Bind(m_pFBOIsoHit[size_t(eStereoID)], 0, m_pFBOIsoHit[size_t(eStereoID)], 1); SetBrickDepShaderVars(b); GLSLProgram* shader = this->ColorData() ? m_pProgramColor : m_pProgramIso; shader->Set("fIsoval", static_cast<float> (this->GetNormalizedIsovalue())); RenderProxyGeometry(); if (m_bDoClearView) { m_TargetBinder.Bind(m_pFBOCVHit[size_t(eStereoID)], 0, m_pFBOCVHit[size_t(eStereoID)], 1); m_pProgramIso->Enable(); m_pProgramIso->Set("fIsoval", static_cast<float> (GetNormalizedCVIsovalue())); RenderProxyGeometry(); } } else { m_pContext->GetStateManager()->SetDepthMask(false); m_TargetBinder.Bind(m_pFBO3DImageNext[size_t(eStereoID)]); SetBrickDepShaderVars(b); RenderProxyGeometry(); } m_TargetBinder.Unbind(); }