Beispiel #1
0
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;
	}
}