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