コード例 #1
0
ファイル: LitSphereWidget.cpp プロジェクト: wdas/brdf
void LitSphereWidget::drawSphere( double r, int lats, int longs )
{
    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_LITSPHERE, &brdfs[0] );
        shader->setUniformMatrix4("projectionMatrix", glm::value_ptr(projectionMatrix));
        shader->setUniformMatrix4("modelViewMatrix",  glm::value_ptr(modelViewMatrix));
        shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
        shader->setUniformFloat( "incidentTheta", inTheta );
        shader->setUniformFloat( "incidentPhi", inPhi );

        shader->setUniformFloat( "brightness", brightness );
        shader->setUniformFloat( "gamma", gamma );
        shader->setUniformFloat( "exposure", exposure );
        shader->setUniformFloat( "useNDotL", useNDotL ? 1.0 : 0.0 );
    }

    if(r!=sphere->radius() || sphere->lats()!=lats || sphere->longs()!=longs)
    {
        delete sphere;
        sphere = new Sphere(r,lats,longs);
    }

    sphere->draw(shader);

    // if there was a shader, now we have to disable it
    if( brdfs[0].brdf )
        brdfs[0].brdf->disableShader( SHADER_LITSPHERE );
}
コード例 #2
0
ファイル: PlotCartesianWidget.cpp プロジェクト: wdas/brdf
void PlotCartesianWidget::paintGL()
{
    if( !isShowing() || !isExposed())
        return;

    glcontext->makeCurrent(this);

    glf->glClearColor(1,1,1,1);
    glf->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glf->glDisable(GL_DEPTH_TEST);

    float currentFWidth = float(width()*devicePixelRatio());
    float currentFHeight = float(height()*devicePixelRatio());
    if(currentFWidth != fWidth || currentFHeight != fHeight)
    {
        fWidth = currentFWidth;
        fHeight = currentFHeight;
        mAspect = fWidth / fHeight;
        updateInputDataLineVAO();
        updateProjectionMatrix();
    }

    glf->glViewport(0, 0, fWidth, fHeight);
    glf->glEnable(GL_MULTISAMPLE);

    drawAxis();
    drawLabels();

    glf->glBindVertexArray(dataLineVAO);
    for( int i = 0; i < (int)brdfs.size(); i++ )
    {
        DGLShader* shader = updateShader( brdfs[i] );
        glf->glDrawArrays(GL_LINE_STRIP_ADJACENCY, 0,  dataLineNPoints);
        shader->disable();
    }
    glf->glBindVertexArray(0);

    glf->glDisable(GL_BLEND);
    glf->glEnable(GL_DEPTH_TEST);

    glcontext->swapBuffers(this);
}
コード例 #3
0
ファイル: Plot3DWidget.cpp プロジェクト: JoelKronander/brdf
void Plot3DWidget::DrawBRDFHemisphere( brdfPackage pkg )
{   
    DGLShader* shader = NULL;
    
    // if there's a BRDF, the BRDF pbject sets up and enables the shader
    if( pkg.brdf )
    {
        shader = pkg.brdf->getUpdatedShader( SHADER_REFLECTOMETER, &pkg );
        shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
        shader->setUniformFloat( "incidentTheta", inTheta );
        shader->setUniformFloat( "incidentPhi", inPhi );
        shader->setUniformFloat( "useLogPlot", useLogPlot ? 1.0 : 0.0 );
        shader->setUniformFloat( "useNDotL", useNDotL ? 1.0 : 0.0 );
    }
    
    // setup to draw the VBO
    glVertexPointer( 3, GL_FLOAT, 0, NULL );
    glBindBuffer(GL_ARRAY_BUFFER, hemisphereVerticesVBO);
    glEnableClientState(GL_VERTEX_ARRAY);
    
    // ... draw it...
    glDrawArrays(GL_TRIANGLES, 0, numTrianglesInHemisphere*3);
    
    // ... and now we're done!
    glDisableClientState(GL_VERTEX_ARRAY);
    
    // if there was a shader, now we have to disable it
    if( pkg.brdf )
        pkg.brdf->disableShader( SHADER_REFLECTOMETER );
}
コード例 #4
0
ファイル: PlotPolarWidget.cpp プロジェクト: ArieLeo/brdf
void PlotPolarWidget::DrawBRDFHemisphere( brdfPackage pkg )
{
	DGLShader* shader = NULL;

	// if there's a BRDF, the BRDF pbject sets up and enables the shader
	if( pkg.brdf )
	{
		shader = pkg.brdf->getUpdatedShader( SHADER_POLAR, &pkg );
		if( shader )
		{
			shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
			shader->setUniformFloat( "incidentTheta", inTheta );
			shader->setUniformFloat( "incidentPhi", inPhi );
			shader->setUniformFloat( "useLogPlot", useLogPlot ? 1.0 : 0.0 );
			shader->setUniformFloat( "useNDotL", useNDotL ? 1.0 : 0.0 );
		}
	}

	glLineWidth( 1 );
	glBegin( GL_LINE_LOOP );
	float inc = 3.14159265 / 360.;
	float angle = 0.0;

	for( int i = 0; i <= 360; i++ )
	{		
		glVertex3f( cos(angle), sin(angle), angle );
		angle += inc;
	}
	glEnd();

	// if there was a shader, now we have to disable it
    if( pkg.brdf )
        pkg.brdf->disableShader( SHADER_POLAR );
}
コード例 #5
0
ファイル: LitSphereWidget.cpp プロジェクト: davvid/brdf
void LitSphereWidget::drawSphere( double, int lats, int longs )
{
	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_LITSPHERE, &brdfs[0] );
		shader->setUniformFloat( "incidentVector", incidentVector[0], incidentVector[1], incidentVector[2] );
		shader->setUniformFloat( "incidentTheta", inTheta );
		shader->setUniformFloat( "incidentPhi", inPhi );

		shader->setUniformFloat( "brightness", brightness );
		shader->setUniformFloat( "gamma", gamma );
		shader->setUniformFloat( "exposure", exposure );
        shader->setUniformFloat( "useNDotL", useNDotL ? 1.0 : 0.0 );
	}

	
	int i, j;
	for(i = 0; i <= lats; i++)
	{
		double lat0 = M_PI * (-0.5 + (double) (i - 1) / lats);
		double z0  = sin(lat0);
		double zr0 =  cos(lat0);
		
		double lat1 = M_PI * (-0.5 + (double) i / lats);
		double z1 = sin(lat1);
		double zr1 = cos(lat1);
		
		glBegin(GL_QUAD_STRIP);
		for(j = 0; j <= longs; j++)
		{
			double lng = 2 * M_PI * (double) (j - 1) / longs;
			double x = cos(lng);
			double y = sin(lng);
			
			glNormal3f(x * zr0, y * zr0, z0);
			glVertex3f(x * zr0, y * zr0, z0);
			glNormal3f(x * zr1, y * zr1, z1);
			glVertex3f(x * zr1, y * zr1, z1);
		}
		glEnd();
	}
  
    // if there was a shader, now we have to disable it
    if( brdfs[0].brdf )
        brdfs[0].brdf->disableShader( SHADER_LITSPHERE );
}
コード例 #6
0
ファイル: IBLWidget.cpp プロジェクト: wdas/brdf
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 );
    }
}
コード例 #7
0
ファイル: PlotCartesianWidget.cpp プロジェクト: wdas/brdf
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;
}