Esempio n. 1
0
void IBLWidget::drawObject()
{
    DGLShader* shader = NULL;

    // if there's a BRDF, the BRDF pbject sets up and enables the shader
    if( brdfs.size() )
    {
        shader = brdfs[0].brdf->getUpdatedShader( SHADER_IBL, &brdfs[0] );

        if( shader )
        {
            shader->setUniformMatrix4("projectionMatrix", glm::value_ptr(projectionMatrix));
            shader->setUniformMatrix4("modelViewMatrix",  glm::value_ptr(modelViewMatrix));
            shader->setUniformMatrix3("normalMatrix",  glm::value_ptr(normalMatrix));

            shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
            shader->setUniformFloat( "gamma", gamma );
            shader->setUniformFloat( "exposure", exposure );

            shader->setUniformTexture( "envCube", envTexID, GL_TEXTURE_CUBE_MAP );

            shader->setUniformTexture( "probTex", probTexID );
            glf->glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
            glf->glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
            shader->setUniformTexture( "marginalProbTex", marginalProbTexID );
            glf->glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
            glf->glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
            shader->setUniformFloat( "texDims", float(envTex.w), float(envTex.h) );

            shader->setUniformMatrix4( "envRotMatrix", glm::value_ptr(envRotMatrix) );
            shader->setUniformMatrix4( "envRotMatrixInverse", glm::value_ptr(envRotMatrixInverse) );

            shader->setUniformInt( "totalSamples", totalSamples );
            shader->setUniformInt( "stepSize", stepSize );
            shader->setUniformInt( "passNumber", sampleGroupOrder[numSampleGroupsRendered] );

            shader->setUniformFloat( "renderWithIBL", (renderWithIBL) ? 1.0 : 0.0 );
            shader->setUniformFloat( "useIBLImportance", bool(iblRenderingMode == RENDER_IBL_IS) ? 1.0 : 0.0 );
            shader->setUniformFloat( "useBRDFImportance", bool(iblRenderingMode == RENDER_BRDF_IS) ? 1.0 : 0.0 );
            shader->setUniformFloat( "useMIS", bool(iblRenderingMode == RENDER_MIS) ? 1.0 : 0.0 );
        }
    }

    CKGL();

    model->drawVBO(shader);

    CKGL();

    // if there was a shader, now we have to disable it
    if( brdfs[0].brdf )
    {
        brdfs[0].brdf->disableShader( SHADER_IBL );
    }
}
Esempio n. 2
0
DGLShader* PlotCartesianWidget::updateShader( brdfPackage pkg )
{
    if( !pkg.brdf )
        return NULL;
    DGLShader* shader = NULL;
    int shaderType = 0;

    if( sliceType == THETA_V_PLOT )
    {
        shaderType = SHADER_CARTESIAN;
        shader = pkg.brdf->getUpdatedShader( shaderType, &pkg );
        if( shader ) shader->setUniformFloat( "phiV", angleParam );
    }
    else if( sliceType == THETA_H_PLOT )
    {
        shaderType = SHADER_CARTESIAN_THETA_H;
        shader = pkg.brdf->getUpdatedShader( shaderType, &pkg );
        if( shader ) shader->setUniformFloat( "thetaD", angleParam );
    }
    else if( sliceType == THETA_D_PLOT )
    {
        shaderType = SHADER_CARTESIAN_THETA_D;
        shader = pkg.brdf->getUpdatedShader( shaderType, &pkg );
        if( shader ) shader->setUniformFloat( "thetaH", angleParam );
    }
    else if( sliceType == ALBEDO_PLOT )
    {
        shaderType = SHADER_CARTESIAN_ALBEDO;
        shader = pkg.brdf->getUpdatedShader( shaderType, &pkg );
        if( shader ) {
            shader->setUniformInt( "nSamples", nSamples );
            shader->setUniformFloat( "sampleMultOn", useSampleMult );
            shader->setUniformInt( "samplingMode", samplingMode );
        }
    }

    if( shader )
    {
        shader->setUniformMatrix4("projectionMatrix", glm::value_ptr(projectionMatrix));
        shader->setUniformMatrix4("modelViewMatrix",  glm::value_ptr(modelViewMatrix));
        shader->setUniformFloat( "useLogPlot", useLogPlot ? 1.0 : 0.0 );
        shader->setUniformFloat( "useNDotL", useNDotL ? 1.0 : 0.0 );
        shader->setUniformFloat( "viewport_size", width()*devicePixelRatio(), height()*devicePixelRatio());
        shader->setUniformFloat( "thickness", 3.f);
        shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
        shader->setUniformFloat( "incidentTheta", inTheta );
        shader->setUniformFloat( "incidentPhi", inPhi );
    }
    return shader;
}