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 ); } }
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; }