veMaterial* veDeferredRenderPipeline::createSpotLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass0 = new vePass;
    auto pass1 = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass0);
    technique->addPass(pass1);
    
    pass0->setRenderPass(vePass::FORWARD_PASS);
    pass0->depthTest() = true;
    pass0->depthWrite() = false;
    pass0->stencilTest() = true;
    pass0->cullFace() = false;
    pass0->stencilFunc() = { GL_ALWAYS, 0, 0, GL_ALWAYS, 0, 0 };
    pass0->stencilOp() = { GL_KEEP, GL_DECR_WRAP, GL_KEEP, GL_KEEP, GL_INCR_WRAP, GL_KEEP };
    pass0->blendFunc() = veBlendFunc::DISABLE;
    pass0->setShader(new veShader(veShader::VERTEX_SHADER, WORLD_BASED_LIGHT_VERTEX_SHADER));
    pass0->setShader(new veShader(veShader::FRAGMENT_SHADER, "layout(location=0) out vec4 fragColor;void main(){}"));
    pass0->addUniform(new veUniform("u_ModelViewProjectMat", MVP_MATRIX));
    pass0->setApplyFunctionCallback([]() {
        glClear(GL_STENCIL_BUFFER_BIT);
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    });
    
    initLightCommomParams(light, pass1);
    pass1->setRenderPass(vePass::FORWARD_PASS);
    pass1->depthTest() = false;
    pass1->depthWrite() = false;
    pass1->stencilTest() = true;
    pass1->cullFace() = true;
    pass1->cullFaceMode() = GL_FRONT;
    pass1->blendFunc().src = GL_ONE;
    pass1->blendFunc().dst = GL_ONE;
    pass1->blendEquation() = GL_FUNC_ADD;
    pass1->stencilFunc() = { GL_NOTEQUAL, 0, 0xFF, GL_NOTEQUAL, 0, 0xFF };
    pass1->setShader(new veShader(veShader::VERTEX_SHADER, WORLD_BASED_LIGHT_VERTEX_SHADER));
    pass1->setShader(new veShader(veShader::FRAGMENT_SHADER, SPOT_LIGHT_FRAGMENT_SHADER));
    pass1->addUniform(new veUniform("u_ModelViewProjectMat", MVP_MATRIX));
    pass1->addUniform(new veUniform("u_lightDirection", veVec3(0.0f)));
    pass1->addUniform(new veUniform("u_lightPosition", veVec3(0.0f)));
    pass1->addUniform(new veUniform("u_lightMatrix", veMat4::IDENTITY));
    pass1->addUniform(new veUniform("u_lightARI", 0.0f));
    pass1->addUniform(new veUniform("u_lightInnerAngleCos", 0.0f));
    pass1->addUniform(new veUniform("u_lightOuterAngleCos", 0.0f));
    pass1->addUniform(new veUniform("u_shadowTex", 4));
    pass1->setApplyFunctionCallback([]() {
        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    });
    
    return material;
}
Esempio n. 2
0
void MeshPicking::process() {
    utilgl::activateAndClearTarget(outport_, ImageType::ColorDepthPicking);

    MeshDrawerGL drawer(meshInport_.getData().get());
    shader_.activate();
    shader_.setUniform("pickingColor_", picking_.getPickingObject()->getPickingColor());

    const auto& ct = meshInport_.getData()->getCoordinateTransformer(camera_.get());

    mat4 dataToClip =
        ct.getWorldToClipMatrix() * glm::translate(position_.get()) * ct.getDataToWorldMatrix();

    shader_.setUniform("dataToClip", dataToClip);

    {
        utilgl::GlBoolState depthTest(GL_DEPTH_TEST, true);
        utilgl::CullFaceState culling(cullFace_.get());
        utilgl::DepthFuncState depthfunc(GL_ALWAYS);
        drawer.draw();
    }

    shader_.deactivate();
    utilgl::deactivateCurrentTarget();
    compositePortsToOutport(outport_, ImageType::ColorDepthPicking, imageInport_);
}
Esempio n. 3
0
void MeshRenderProcessorGL::process() {

    if (imageInport_.isConnected()){
        utilgl::activateTargetAndCopySource(outport_, imageInport_);
    }
    else{
        utilgl::activateAndClearTarget(outport_, COLOR_DEPTH);
    }
    
    shader_.activate();

    utilgl::setShaderUniforms(shader_, camera_, "camera_");
    utilgl::setShaderUniforms(shader_, lightingProperty_, "light_");
    utilgl::setShaderUniforms(shader_, overrideColor_);

    utilgl::GlBoolState depthTest(GL_DEPTH_TEST, true);
    utilgl::CullFaceState culling(cullFace_.get());
    utilgl::PolygonModeState polygon(polygonMode_.get(), renderLineWidth_, renderPointSize_);

    for (auto& drawer : drawers_) {
        utilgl::setShaderUniforms(shader_, *(drawer.second->getGeometry()), "geometry_");
        drawer.second->draw();
    }

    shader_.deactivate();
    utilgl::deactivateCurrentTarget();
}
veMaterial* veDeferredRenderPipeline::createIBLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    initLightCommomParams(light, pass);
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, IB_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_lightDirection", veVec3::ZERO));
    pass->addUniform(new veUniform("u_specularMipMapCount", 1.0f));
    pass->addUniform(new veUniform("u_diffuseLighting", 4));
    pass->addUniform(new veUniform("u_specularLighting", 5));
    
    
    return material;
}
veMaterial* veDeferredRenderPipeline::createDirectionalLightMaterial(veLight *light)
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    initLightCommomParams(light, pass);
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, DIRECTIONAL_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_lightDirection", veVec3::ZERO));
    pass->addUniform(new veUniform("u_lightMatrixs", &veMat4::IDENTITY, 1));
    pass->addUniform(new veUniform("u_shadowCascadedLevels", 0.f));
    pass->addUniform(new veUniform("u_shadowCascadedCount", 0.f));
    pass->addUniform(new veUniform("u_shadowTex", 4));
    
    return material;
}
void PCPUploadRenderer::renderParallelCoordinates() {
    std::shared_ptr<const ParallelCoordinatesPlotRawData> data = _inport.getData();
    int nDimensions = data->minMax.size();
    int nValues = data->data.size();

    utilgl::GlBoolState depthTest(GL_DEPTH_TEST, !_depthTesting);
    utilgl::BlendModeEquationState blendEquation(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD);

    utilgl::GlBoolState lineSmooth(GL_LINE_SMOOTH, _lineSmoothing);
    if (_lineSmoothing)
        glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    _shader.activate();

    _shader.setUniform("_nDimensions", nDimensions);
    _shader.setUniform("_nData", nValues / nDimensions);
    _shader.setUniform("_horizontalBorder", _horizontalBorder);
    _shader.setUniform("_verticalBorder", _verticalBorder);
    _shader.setUniform("_depthTesting", !_depthTesting);
    _shader.setUniform("_alphaFactor", _alphaFactor);

    TextureUnit tfUnit;
    utilgl::bindTexture(_transFunc, tfUnit);
    _shader.setUniform("_transFunc", tfUnit.getUnitNumber());

    glBindVertexArray(_vao);

    bool hasColoringData = _coloringData.hasData() && _coloringData.getData()->hasData;
    _shader.setUniform("_hasColoringData", hasColoringData);
    if (hasColoringData) {
        glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, _coloringData.getData()->ssboColor);
    }

    //glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, data->ssboData);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, _dimensionOrderingBuffer);

    //for (int i = 0; i < nValues / nDimensions; ++i) {
    //    glDrawElements(GL_LINE_STRIP, nDimensions, )
    //}

    glEnable(GL_PRIMITIVE_RESTART);
    glPrimitiveRestartIndex(PRIM_RESTART);

    glDrawElements(GL_LINE_STRIP, nValues / nDimensions, GL_UNSIGNED_INT, _drawElements);


    glDisable(GL_PRIMITIVE_RESTART);
    //glDrawArrays(GL_LINE_STRIP, 0, nValues);

    //glMultiDrawArrays(GL_LINE_STRIP, _multiDrawIndices, _multiDrawCount, nValues / nDimensions);

    //glDrawArraysInstanced(GL_LINE_STRIP, 0, data->nDimensions, data->nValues / data->nDimensions);

    glBindVertexArray(0);

    _shader.deactivate();
}
void MeshRenderProcessorGLSR::process() {
 /*   if (imageInport_.isConnected()) {
        utilgl::activateTargetAndCopySource(outport_, imageInport_);
    } else {
        utilgl::activateAndClearTarget(outport_, ImageType::ColorDepth);
    }  */  
	utilgl::activateAndClearTarget(outport_, ImageType::ColorDepth);

	if (meshName_.isConnected())
	{
		auto inDescr = *meshName_.getData();
		sceneDesc_->setInputName(inDescr.getInputName());

	}
	//LogInfo(inport_.getContentInfo());
	//LogInfo(inport_.getClassIdentifier());
	
    shader_.activate();
    utilgl::setShaderUniforms(shader_, camera_, "camera_");
	//std::cout << "Camera Position = " << camera_.position.x
	LogInfo(camera_.getLookFrom());
    utilgl::setShaderUniforms(shader_, lightingProperty_, "light_");
	LogInfo(lightingProperty_.silhouetteThreshold_);
    LogInfo(lightingProperty_.depthThreshold_);
	LogInfo(lightingProperty_.specularExponent_);
	utilgl::setShaderUniforms(shader_, lightingProperty_.silhouetteThreshold_, "threshold_sil");
    utilgl::setShaderUniforms(shader_, lightingProperty_.depthThreshold_, "threshold_depth");
    utilgl::setShaderUniforms(shader_, overrideColor_);

    utilgl::GlBoolState depthTest(GL_DEPTH_TEST, enableDepthTest_.get());
    utilgl::CullFaceState culling(cullFace_.get());
    utilgl::PolygonModeState polygon(polygonMode_.get(), renderLineWidth_, renderPointSize_);

    for (auto& drawer : drawers_) {
        utilgl::setShaderUniforms(shader_, *(drawer.second->getGeometry()), "geometry_");
        drawer.second->draw();
    }

	sceneDesc_->setImageDimensions(outport_.getDimensions());
	sceneDesc_->setShaderName(lightingProperty_.shadingMode_.getSelectedDisplayName());
	sceneDesc_->setLayerDescription(layersDeclaration_);
	/*setImageDimensions(*sceneDesc_);
	setShaderName(*sceneDesc_);
	setLayerDescription(*sceneDesc_);*/
	sceneDesc_->printDescription();
	sceneDescOutport_.setData(sceneDesc_);

    utilgl::deactivateCurrentTarget();

}
Esempio n. 8
0
Material::Material(Material_t tag)
    : tag(tag),
      vertexShader(this),
      fragmentShader(this),
      index0AttributeName(this)
{
    mId = Material::MaterialIdCount++;

    mUuid = Math::generateUUID();

    mName = "";

    side() = kFrontSide;

    opacity() = 1.0f;
    transparent() = false;

    blending() = kNormalBlending;

    blendSrc() = kSrcAlphaFactor;
    blendDst() = kOneMinusSrcAlphaFactor;
    blendEquation() = kAddEquation;

    depthTest() = true;
    depthWrite() = true;

    polygonOffset() = false;
    polygonOffsetFactor() = 0;
    polygonOffsetUnits() = 0;

    // mAlphaTest = 0;

    overdraw() = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer

    visible() = true;

    needsUpdate() = true;

    // By default, bind position to attribute index 0. In WebGL, attribute 0
    // should always be used to avoid potentially expensive emulation.
    index0AttributeName("position");

    linewidth() = 1.0f;
    metal() = false;
    perPixel() = true;
    shading() = kNoShading;
	vertexColors() = kNoColors;
    wireframe() = false;
    wireframeLinewidth() = 1.0f;
}
void PCPRenderer::renderParallelCoordinates() {
    std::shared_ptr<const ParallelCoordinatesPlotData> data = _inport.getData();
    utilgl::GlBoolState depthTest(GL_DEPTH_TEST, !_depthTesting);

    //utilgl::GlBoolState alpha(GL_ALPHA, _alphaFactor != 1.f);
    utilgl::BlendModeEquationState blendEquation(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD);

    utilgl::GlBoolState lineSmooth(GL_LINE_SMOOTH, _lineSmoothing);
    if (_lineSmoothing)
        glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    _shader.activate();

    _shader.setUniform("_nDimensions", data->nDimensions);
    _shader.setUniform("_nData", data->nValues / data->nDimensions);
    _shader.setUniform("_horizontalBorder", _horizontalBorder);
    _shader.setUniform("_verticalBorder", _verticalBorder);
    _shader.setUniform("_depthTesting", _depthTesting);
    _shader.setUniform("_alphaFactor", _alphaFactor);

    TextureUnit tfUnit;
    utilgl::bindTexture(_transFunc, tfUnit);
    _shader.setUniform("_transFunc", tfUnit.getUnitNumber());

    glBindVertexArray(_vao);

    bool hasColoringData = _coloringData.hasData() && _coloringData.getData()->hasData;
    _shader.setUniform("_hasColoringData", hasColoringData);
    if (hasColoringData) {
        glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, _coloringData.getData()->ssboColor);
    }

    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, data->ssboData);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, _dimensionOrderingBuffer);

    glDrawArraysInstanced(GL_LINE_STRIP, 0, data->nDimensions, data->nValues / data->nDimensions);

    glBindVertexArray(0);

    _shader.deactivate();
}
void AxisAlignedCutPlane::process() {
    if (imageInport_.isConnected()) {
        utilgl::activateTargetAndCopySource(outport_, imageInport_, ImageType::ColorDepth);
    } else {
        utilgl::activateAndClearTarget(outport_, ImageType::ColorDepth);
    }
    
    if (!boundingBoxDrawer_) {
        boundingBoxDrawer_ =
            getNetwork()->getApplication()->getMeshDrawerFactory()->create(boundingBoxMesh_.get());
    }

    utilgl::GlBoolState depthTest(GL_DEPTH_TEST, true);

    drawBoundingBox();
    TextureUnitContainer cont;

    sliceShader_.activate();
    utilgl::setShaderUniforms(sliceShader_, camera_, "camera_");
    utilgl::bindAndSetUniforms(sliceShader_, cont, volume_);
    if (nearestInterpolation_.get()) {
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    } else {
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    }
    if (!disableTF_.get()) {
        utilgl::bindAndSetUniforms(sliceShader_, cont, tf_);
    }
    xSlide_.draw(sliceShader_);
    ySlide_.draw(sliceShader_);
    zSlide_.draw(sliceShader_);
    sliceShader_.deactivate();

    utilgl::deactivateCurrentTarget();
}
veMaterial* veDeferredRenderPipeline::createAmbientLightMaterial()
{
    auto material = new veMaterial;
    auto technique = new veTechnique;
    auto pass = new vePass;
    material->addTechnique(technique);
    technique->addPass(pass);
    
    pass->setRenderPass(vePass::FORWARD_PASS);
    pass->depthTest() = false;
    pass->depthWrite() = false;
    pass->stencilTest() = false;
    pass->cullFace() = true;
    pass->cullFaceMode() = GL_BACK;
    pass->blendFunc().src = GL_ONE;
    pass->blendFunc().dst = GL_ONE;
    pass->blendEquation() = GL_FUNC_ADD;
    pass->setShader(new veShader(veShader::VERTEX_SHADER, SCREEN_BASED_LIGHT_VERTEX_SHADER));
    pass->setShader(new veShader(veShader::FRAGMENT_SHADER, AMBIENT_LIGHT_FRAGMENT_SHADER));
    pass->addUniform(new veUniform("u_ambient", veVec3::ZERO));
    pass->addUniform(new veUniform("u_RT1", 0));
    
    return material;
}
void ABufferGeometryGLProcessor::geometryRender() {
    ABUFFER_PROFILE("Total-Time");

    // tempImage_ = new Image(outport_.getDimensions());
    auto tempImage_ = outport_.getEditableData();
    ImageGL* tempImageGL = tempImage_->getEditableRepresentation<ImageGL>();
    ivec2 dim = outport_.getDimensions();

    bool abufferEnabled = abuffer_.settings_.abufferEnable_.get();

    // abuffer initialization
    if (abufferEnabled) {
        ABUFFER_PROFILE("Initialize-abuffer");
        abuffer_.abuffer_initABuffer(dim, updateRequried_);

        LGL_ERROR;
        abuffer_.abuffer_addShaderDefinesAndBuild(&abuffer_.resolveABufferShader_);

        LGL_ERROR;
        ABUFFER_PROFILE("Reset-abuffer");
        abuffer_.aBuffer_resetLinkList(tempImageGL);

        updateRequried_ = false;
    }

    abuffer_.abuffer_addShaderDefinesAndBuild(&abufferGeometryShader_);

    // Rendering
    {
        ABUFFER_PROFILE("Rendering");

        tempImageGL = tempImage_->getEditableRepresentation<ImageGL>();
        utilgl::activateAndClearTarget(outport_);

        // initialize shader
        abufferGeometryShader_.activate();
        // LGL_ERROR;
        utilgl::setShaderUniforms(abufferGeometryShader_, camera_, "camera_");
        // LGL_ERROR;
        utilgl::setShaderUniforms(abufferGeometryShader_, lightingProperty_, "light_");
        // LGL_ERROR;

        if (abufferEnabled) {
            abuffer_.abuffer_addUniforms(&abufferGeometryShader_);
            abufferGeometryShader_.setUniform("globalTransparency_", transparency_.get());
        }

        utilgl::GlBoolState depthTest(GL_DEPTH_TEST, true);
        utilgl::CullFaceState culling(cullFace_.get());
        utilgl::PolygonModeState polygon(polygonMode_.get(), renderLineWidth_, renderPointSize_);

        for (auto& drawer : drawers_) {
            utilgl::setShaderUniforms(abufferGeometryShader_, *(drawer.second->getGeometry()),
                                      "geometry_");
            drawer.second->draw();
        }

        abufferGeometryShader_.deactivate();
        utilgl::deactivateCurrentTarget();

        glMemoryBarrierEXT(GL_ALL_BARRIER_BITS_EXT);
    }

    // abuffer resolve
    if (abufferEnabled) {
        ABUFFER_PROFILE("Resolving-abuffer");
        utilgl::activateAndClearTarget(outport_);
        abuffer_.aBuffer_resolveLinkList(tempImageGL);
        utilgl::deactivateCurrentTarget();
    }
}