void StereoMeshEntryExitPoints::process() {
    // retrieve input geometry
    const MeshListGeometry* meshListGeometry = dynamic_cast<const MeshListGeometry*>(inport_.getData());
    const MeshGeometry* meshGeometry = dynamic_cast<const MeshGeometry*>(inport_.getData());
    if (meshListGeometry) {
        geometry_ = *meshListGeometry;
    }
    else if (meshGeometry) {
        geometry_.clear();
        geometry_.addMesh(*meshGeometry);
    }
    else {
        LERROR("Geometry of type MeshListGeometry/MeshGeometry expected.");
        return;
    }

    // A new volume was loaded
    if(inport_.hasChanged())
        cameraHandler_->adaptInteractionToScene(geometry_);

    // set modelview and projection matrices
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    tgt::loadMatrix(camera_.get().getProjectionMatrix(entryPort_.isReady() ? entryPort_.getSize() : exitPort_.getSize()));

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    tgt::loadMatrix(camera_.get().getViewMatrix());

    // enable culling
    if(useCulling_.get())
        glEnable(GL_CULL_FACE);

    // activate shader program
    shaderProgram_->activate();
    tgt::Camera cam = camera_.get();
    setGlobalShaderParameters(shaderProgram_, &cam);
    LGL_ERROR;

    //
    // render back texture
    //
    if (exitPort_.isReady()) {
        exitPort_.activateTarget();
        glClearDepth(0.0f);
        glDepthFunc(GL_GREATER);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glCullFace(GL_FRONT);

        geometry_.render();
        LGL_ERROR;
        exitPort_.deactivateTarget();
        glDepthFunc(GL_LESS);
        glClearDepth(1.0f);
        LGL_ERROR;
    }

    //
    // render front texture
    //
    // use temporary target if necessary
    if (entryPort_.isReady()) {
        if (!jitterEntryPoints_.get())
            entryPort_.activateTarget();
        else
            tmpPort_.activateTarget();
        LGL_ERROR;

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glCullFace(GL_BACK);

        geometry_.render();
        LGL_ERROR;

        if (supportCameraInsideVolume_.get()) {
            // clip proxy geometry against near-plane
            float nearPlaneDistToOrigin = tgt::dot(camera_.get().getPosition(), -camera_.get().getLook()) - camera_.get().getNearDist() - 0.0001f;
            MeshListGeometry closingFaces;
            double epsilon = static_cast<double>(tgt::length(geometry_.getBoundingBox().diagonal())) * 1e-6;
            geometry_.clip(tgt::vec4(-camera_.get().getLook(), nearPlaneDistToOrigin), closingFaces, epsilon);

            // render closing face separately, if not empty
            if (!closingFaces.empty()) {
                // project closing faces onto near-plane
                tgt::mat4 trafoMatrix = camera_.get().getProjectionMatrix(entryPort_.getSize()) * camera_.get().getViewMatrix();
                closingFaces.transform(trafoMatrix);
                // set z-coord of closing face vertices to 0.0 in order to avoid near-plane clipping
                tgt::mat4 zTrafo = tgt::mat4::createIdentity();
                zTrafo[2][2] = 0.f;
                closingFaces.transform(zTrafo);

                //render closing faces with identity transformations
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                glMatrixMode(GL_MODELVIEW);
                glLoadIdentity();
                closingFaces.render();
                LGL_ERROR;
            }
        }

        if (!jitterEntryPoints_.get())
            entryPort_.deactivateTarget();
        else
            tmpPort_.deactivateTarget();
    }

    // deactivate shader program
    shaderProgram_->deactivate();

    // restore OpenGL state
    glCullFace(GL_BACK);
    glDisable(GL_CULL_FACE);
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    LGL_ERROR;

    if (entryPort_.isReady()) {
        // jittering of entry points
        if (jitterEntryPoints_.get())
            jitterEntryPoints();

        entryPort_.deactivateTarget();
    }

    TextureUnit::setZeroUnit();
    LGL_ERROR;
}