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; } } }
void FrameBufferObject::saveToDisk(const unsigned int colorBufferNum, const std::string &path) const { if(this->nbColorAttachement>0 && (int)colorBufferNum<this->nbColorAttachement) { float *data = new float[width * height * 3]; glEnable(GL_TEXTURE_2D); bindColorTexture(colorBufferNum); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, data); glDisable(GL_TEXTURE_2D); ref<Bitmap> bmp = new Bitmap(width, height, 128); for(unsigned int i=0; i < width*height; i+=1) { bmp->getFloatData()[i*4] = data[i*3]; bmp->getFloatData()[i*4+1] = data[i*3+1]; bmp->getFloatData()[i*4+2] = data[i*3+2]; bmp->getFloatData()[i*4+3] = 1.0f; } bmp->save(Bitmap::EEXR, new FileStream(path, FileStream::ETruncWrite) ); delete [] data; } }