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::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); 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); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } } if (b.bIsEmpty) return; GPUState localState = m_BaseState; localState.enableBlend = false; localState.depthMask = false; localState.enableCullFace = true; m_pContext->GetStateManager()->Apply(localState); renderRegion.modelView[size_t(eStereoID)].setModelview(); m_mProjection[size_t(eStereoID)].setProjection(); // write frontfaces (ray entry points) m_TargetBinder.Bind(m_pFBORayEntry); m_pProgramRenderFrontFaces->Enable(); RenderBox(renderRegion, b.vCenter, b.vExtension, b.vTexcoordsMin, b.vTexcoordsMax, false, eStereoID); /* float* vec = new float[m_pFBORayEntry->Width()*m_pFBORayEntry->Height()*4]; m_pFBORayEntry->ReadBackPixels(0,0,m_pFBORayEntry->Width(),m_pFBORayEntry->Height(), vec); delete [] vec; */ if (m_eRenderMode == RM_ISOSURFACE) { m_pContext->GetStateManager()->SetDepthMask(true); m_TargetBinder.Bind(m_pFBOIsoHit[size_t(eStereoID)], 0, m_pFBOIsoHit[size_t(eStereoID)], 1); GLSLProgram* shader = this->ColorData() ? m_pProgramColor : m_pProgramIso; shader->Enable(); SetBrickDepShaderVars(renderRegion, b, iCurrentBrick); m_pFBORayEntry->Read(2); RenderBox(renderRegion, b.vCenter, b.vExtension, b.vTexcoordsMin, b.vTexcoordsMax, true, eStereoID); m_pFBORayEntry->FinishRead(); if (m_bDoClearView) { m_TargetBinder.Bind(m_pFBOCVHit[size_t(eStereoID)], 0, m_pFBOCVHit[size_t(eStereoID)], 1); m_pProgramIso2->Enable(); m_pFBORayEntry->Read(2); m_pFBOIsoHit[size_t(eStereoID)]->Read(4, 0); m_pFBOIsoHit[size_t(eStereoID)]->Read(5, 1); RenderBox(renderRegion, b.vCenter, b.vExtension, b.vTexcoordsMin, b.vTexcoordsMax, true, eStereoID); m_pFBOIsoHit[size_t(eStereoID)]->FinishRead(1); m_pFBOIsoHit[size_t(eStereoID)]->FinishRead(0); m_pFBORayEntry->FinishRead(); } } else { m_TargetBinder.Bind(m_pFBO3DImageNext[size_t(eStereoID)]); // do the raycasting switch (m_eRenderMode) { case RM_1DTRANS : m_pProgram1DTrans[m_bUseLighting ? 1 : 0]->Enable(); break; case RM_2DTRANS : m_pProgram2DTrans[m_bUseLighting ? 1 : 0]->Enable(); break; default : T_ERROR("Invalid rendermode set"); break; } m_pContext->GetStateManager()->SetEnableBlend(true); SetBrickDepShaderVars(renderRegion, b, iCurrentBrick); m_pFBORayEntry->Read(2); RenderBox(renderRegion, b.vCenter, b.vExtension, b.vTexcoordsMin, b.vTexcoordsMax, true, eStereoID); m_pFBORayEntry->FinishRead(); } m_TargetBinder.Unbind(); }
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; } }