void bindAndSetUniforms(Shader& shader, TextureUnitContainer& cont, VolumeInport& volumePort) { TextureUnit unit; utilgl::bindTexture(volumePort, unit); shader.setUniform(volumePort.getIdentifier(), unit.getUnitNumber()); utilgl::setShaderUniforms(shader, volumePort, volumePort.getIdentifier() + "Parameters"); cont.push_back(std::move(unit)); }
void bindAndSetUniforms(Shader& shader, TextureUnitContainer& cont, const TransferFunctionProperty& tf) { TextureUnit unit; bindTexture(tf, unit); shader.setUniform(tf.getIdentifier(), unit.getUnitNumber()); cont.push_back(std::move(unit)); }
void bindAndSetUniforms(Shader& shader, TextureUnitContainer& cont, const Texture& texture, const std::string samplerID) { TextureUnit unit; bindTexture(texture, unit); shader.setUniform(samplerID, unit.getUnitNumber()); cont.push_back(std::move(unit)); }
IVW_MODULE_OPENGL_API void bindAndSetUniforms(Shader& shader, TextureUnitContainer& cont, const Volume& volume, const std::string& samplerID) { TextureUnit unit; utilgl::bindTexture(volume, unit); shader.setUniform(samplerID, unit.getUnitNumber()); utilgl::setShaderUniforms(shader, volume, samplerID + "Parameters"); cont.push_back(std::move(unit)); }
void bindAndSetUniforms(Shader& shader, TextureUnitContainer& cont, const Image& image, const std::string& id, ImageType type) { switch (type) { case COLOR_ONLY: { TextureUnit unit; bindColorTexture(image, unit); utilgl::setShaderUniforms(shader, image, id + "Parameters"); shader.setUniform(id + "Color", unit.getUnitNumber()); cont.push_back(std::move(unit)); break; } case COLOR_DEPTH: { TextureUnit unit1, unit2; bindTextures(image, unit1, unit2); utilgl::setShaderUniforms(shader, image, id + "Parameters"); shader.setUniform(id + "Color", unit1.getUnitNumber()); shader.setUniform(id + "Depth", unit2.getUnitNumber()); cont.push_back(std::move(unit1)); cont.push_back(std::move(unit2)); break; } case COLOR_PICKING: { TextureUnit unit1, unit2; bindColorTexture(image, unit1); bindPickingTexture(image, unit2); utilgl::setShaderUniforms(shader, image, id + "Parameters"); shader.setUniform(id + "Color", unit1.getUnitNumber()); shader.setUniform(id + "Picking", unit2.getUnitNumber()); cont.push_back(std::move(unit1)); cont.push_back(std::move(unit2)); break; } case COLOR_DEPTH_PICKING: { TextureUnit unit1, unit2, unit3; bindTextures(image, unit1, unit2, unit3); utilgl::setShaderUniforms(shader, image, id + "Parameters"); shader.setUniform(id + "Color", unit1.getUnitNumber()); shader.setUniform(id + "Depth", unit2.getUnitNumber()); shader.setUniform(id + "Picking", unit3.getUnitNumber()); cont.push_back(std::move(unit1)); cont.push_back(std::move(unit2)); cont.push_back(std::move(unit3)); break; } } }
bool ImageGL::copyRepresentationsTo(ImageGL* target) const { const ImageGL* source = this; auto singleChannel = source->getColorLayerGL()->getDataFormat()->getComponents() == 1; // Set shader to copy all color layers if (!shader_.isReady() || singleChanelCopy_ != singleChannel || colorLayerCopyCount_ != colorLayersGL_.size()) { std::stringstream ssUniform; for (size_t i = 1; i < colorLayersGL_.size(); ++i) { ssUniform << "layout(location = " << i + 1 << ") out vec4 FragData" << i << ";"; } for (size_t i = 1; i < colorLayersGL_.size(); ++i) { ssUniform << "uniform sampler2D color" << i << ";"; } shader_.getFragmentShaderObject()->addShaderDefine("ADDITIONAL_COLOR_LAYER_OUT_UNIFORMS", ssUniform.str()); std::stringstream ssWrite; for (size_t i = 1; i < colorLayersGL_.size(); ++i) { if (singleChannel) { ssWrite << "FragData" << i << " = vec4(texture(color" << i << ", texCoord_.xy).r);"; } else { ssWrite << "FragData" << i << " = texture(color" << i << ", texCoord_.xy);"; } } shader_.getFragmentShaderObject()->addShaderDefine("ADDITIONAL_COLOR_LAYER_WRITE", ssWrite.str()); if (colorLayersGL_.size() > 1) { shader_.getFragmentShaderObject()->addShaderDefine("ADDITIONAL_COLOR_LAYERS"); } else { shader_.getFragmentShaderObject()->removeShaderDefine("ADDITIONAL_COLOR_LAYERS"); } if (singleChannel) { shader_.getFragmentShaderObject()->addShaderDefine("SINGLE_CHANNEL"); } else { shader_.getFragmentShaderObject()->removeShaderDefine("SINGLE_CHANNEL"); } colorLayerCopyCount_ = colorLayersGL_.size(); singleChanelCopy_ = singleChannel; shader_.build(); } TextureUnit colorUnit, depthUnit, pickingUnit; source->getColorLayerGL()->bindTexture(colorUnit.getEnum()); if (source->getDepthLayerGL()) { source->getDepthLayerGL()->bindTexture(depthUnit.getEnum()); } if (source->getPickingLayerGL()) { source->getPickingLayerGL()->bindTexture(pickingUnit.getEnum()); } TextureUnitContainer additionalColorUnits; for (size_t i = 0; i < colorLayersGL_.size(); ++i) { TextureUnit unit; source->getColorLayerGL(i)->bindTexture(unit.getEnum()); additionalColorUnits.push_back(std::move(unit)); } // Render to FBO, with correct scaling target->activateBuffer(ImageType::AllLayers); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float ratioSource = (float)source->getDimensions().x / (float)source->getDimensions().y; float ratioTarget = (float)target->getDimensions().x / (float)target->getDimensions().y; glm::mat4 scale; if (ratioTarget < ratioSource) scale = glm::scale(glm::vec3(1.0f, ratioTarget / ratioSource, 1.0f)); else scale = glm::scale(glm::vec3(ratioSource / ratioTarget, 1.0f, 1.0f)); GLint prog; glGetIntegerv(GL_CURRENT_PROGRAM, &prog); shader_.activate(); shader_.setUniform("color_", colorUnit.getUnitNumber()); if (source->getDepthLayerGL()) { shader_.setUniform("depth_", depthUnit.getUnitNumber()); } if (source->getPickingLayerGL()) { shader_.setUniform("picking_", pickingUnit.getUnitNumber()); } for (size_t i = 0; i < additionalColorUnits.size(); ++i) { shader_.setUniform("color" + toString<size_t>(i + 1), additionalColorUnits[i].getUnitNumber()); } shader_.setUniform("dataToClip", scale); LGL_ERROR; target->renderImagePlaneRect(); LGL_ERROR; shader_.deactivate(); target->deactivateBuffer(); LGL_ERROR; glUseProgram(prog); return true; }